触发器分为两种,一种与数据表绑定,响应数据表指定动作(insert、delete或update),此处称为表级;一种与数据库本身绑定,响应数据定义语句(主要是CREATE、ALTER 和 DROP 开头的语句),此处称为库级。本篇以下所说触发器皆指表级触发器。

触发器是一段有特定语法,实现一定功能的SQL语句,它与数据表绑定,当数据表发生指定动作(insert、delete或update)时,由数据库自动调用。一个触发器必须且只能绑定一张数据表,必须且只能绑定数据表的一个动作(insert、delete或update)。触发器可以分为两种,一种是动作之后(After),一种是替代执行(instead of)。两种触发器可以同时绑定数据表的同一个动作(insert、delete或update)。但动作之后(After)触发器可以同时绑定多个,而替代执行(instead of)触发器一个数据表只能绑定三个,即一个动作(insert、delete或update)只能绑定一个。

触发器耗费性能,不易调试,不利于迁移,不符合时兴的面向对象设计理念,也不容易被接手老项目的人注意到,因而应尽量避免使用。

触发器语法:

  1. 创建:
  2. CREATE TRIGGER trigger_name --触发器的名字
  3. ON {table_name | view_name} --与触发器绑定的表或视图,必须且只能与一个表或视图绑定
  4. {FOR | After | Instead of } --触发器类型,动作之后(After)或替代执行(instead of
  5. [ insert, update,delete ] --触发器响应的具体动作,一个触发器只能响应一个动作
  6. AS
  7. sql_statement --你需要编写的SQL语句
  1. 删除:
  2. DROP TRIGGER { trigger/*要删除的触发器名字*/ } [ ,...n ]
  1. 修改:
  2. ALTER TRIGGER trigger_name --触发器的名字
  3. ON table_name --与触发器绑定的表或视图,必须且只能与一个表或视图绑定
  4. {FOR | After | Instead of } --触发器类型,动作之后(After)或替代执行(instead of
  5. {[DELETE][,][INSERT][,][UPDATE]}--触发器响应具体动作,一个触发器只能响应一个动作
  6.  
  7. AS
  8. sql_statement; --你需要编写的SQL语句
  1. 禁用启用触发器:
  2.   禁用:alter table 表名 disable trigger 触发器名称
  3.   启用:alter table 表名 enable trigger 触发器名称

触发器执行后会自动创建两张虚表inserted与deleted。它们可以理解为系统自动创建的、在触发器中使用的临时表,触发器开始时创建,结束后删除。它们的结构与触发器绑定的表结构一致,并且是只读的。

动作

Inserted

Deleted

增加(insert)

存放增加的记录

删除(delete)

存放被删除的记录

修改(update)

存放更新后的记录

存放更新前的记录

当数据表只存在动作之后(After)触发器时,动作(insert、delete或update)对数据表进行真实更改,而存在替代执行(instead of)触发器时,动作(insert、delete或update)不对数据表进行真实更改。替代执行(instead of)触发器执行时间先于动作之后(After)触发器。有多个动作之后(After)触发器时,执行顺序取决于触发器建立时间,先建立的先执行。

触发器中不能使用以下语句:

  1. CREATE 语句,如:CREATE DATABASECREATE TABLECREATE INDEX 等。
  2. ALTER 语句,如:ALTER DATABASEALTER TABLEALTER INDEX 等。
  3. DROP 语句,如:DROP DATABASEDROP TABLEDROP INDEX 等。
  4. DISK 语句,如:DISK INITDISK RESIZE
  5. LOAD 语句,如:LOAD DATABASELOAD LOG
  6. RESTORE 语句,如:RESTORE DATABASERESTORE LOG

=====================================================================================
本文只代表本人的见解,可能存在错误,仅用于技术交流。如果你喜欢该文,可以扫下面的二维码打赏我(打赏敬请备注“博客园打赏”五字)。

SQL Server基础之表级触发器的更多相关文章

  1. VFP获取 SQL Server 的数据表、触发器、存储过程、视图等脚本

    本文代码转载自红雨先生 *-----------------------------------------------* SqlServer 相关函数*----------------------- ...

  2. SQL Server基础之登陆触发器

    虽然同表级(DML)触发器和库级(DDL)触发器共顶着一个帽子,但登陆触发器与二者有本质区别.无论表级还是库级,都是用来进行数据管理的,而登陆触发器是纯粹的安全工具. 登陆触发器只响应LOGON事件, ...

  3. SQL server基础知识(表操作、数据约束、多表链接查询)

    SQL server基础知识 一.基础知识 (1).存储结构:数据库->表->数据 (2).管理数据库 增加:create database 数据库名称 删除:drop database ...

  4. SQL server 数据库用户表名称

    转自(http://blog.163.com/jlj_sk/blog/static/22579293200861422833924/) 取得SQL server 数据库中 所有用户表名称 select ...

  5. SQL Server数据库、表、数据类型基本概念

    一.SQL Server的数据存储结构 SQL Server是一个数据库管理系统,需要以有效方式存储高容量数据.要更好地理解SQL Server处理数据的方式,就需要了解数据的存储结构. 1.文件类型 ...

  6. 《SQL Server基础——SQL语句》

    SQL Server基础--SQL语句       一.创建和删除数据库: 1.创建数据库(默认化初始值) 格式: CREATE DATABASE 数据库名称 例如: CREATE DATABASE ...

  7. 数据库开发基础-SQl Server 基础

    SQL Server 基础 1.什么是SQL Server SQL:Structured Query Language  结构化查询语言 SQL Server是一个以客户/服务器(c/s)模式访问.使 ...

  8. 【SQL Server】SQL Server基础之存储过程

    SQL Server基础之存储过程  阅读目录 一:存储过程概述 二:存储过程分类 三:创建存储过程 1.创建无参存储过程 2.修改存储过程 3.删除存储过程 4.重命名存储过程 5.创建带参数的存储 ...

  9. Oracle\MS SQL Server Update多表关联更新

    原文:Oracle\MS SQL Server Update多表关联更新 一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表 ...

随机推荐

  1. struts2--使用<s:token></s:token>标签防止重复提交

    取个小例子:这是网页: <body> <s:actionerror/> <s:form action="LoginAction" method=&qu ...

  2. Chrome 浏览器最牛插件之一 Vimium

    导航当页: ? 显示help,查询vimium的所有使用方法 h 向左滚动 j 向下滚动 k 向上滚动 l 向右滚动 gg 滚动到顶部 G 滚动到底部 d 向下滚动半页 u 向上滚动半页面 f 显示链 ...

  3. Perl的子程序

    子程序(subroutine) perl中的子程序其实就是自定义函数.它使用sub关键字开头,表示声明一个子程序 子程序名称有独立的名称空间,不会和其它名称冲突 Perl中的子程序中可以定义.引用.修 ...

  4. OOP面向对象

    一:什么是面向过程 我们是怎么思考和解决上面的问题呢? 答案是:我们自己的思维一直按照步骤来处理这个问题,这是我们的常规思维,这就是所谓的面向过程POP编程   二:面向过程POP为什么转换为OOP ...

  5. TCP&UDP&Socket讲解(上)

    这两天我将整理TCP&UDP&Socket,大约花大家10-15分钟之间,希望本篇文章让大家对TCP使用的理解提高一个层次. 建议大家拿出纸和笔,画一下!!! 一.TCP 1. TCP ...

  6. 第一册:lesson sixty one.

    原文: A bad cold. A:Where is Jim? B:He is in bed. A:What's the matter with him? B:He fells ill. A:He l ...

  7. eclipse使用svn

    主干(trunk).分支(branch ).标记(tag) 用法示例 + 图解   以svn为例,git的master相当于trunk,dev分支相当于branches --------------- ...

  8. <a>标签的特殊和文本的样式

    a是特殊的,要改变a里面的颜色,必须直接给a设置,给a的父级设置不行 属性继承:明明是父级上的的设置样式,结果后代标签也跟着发生变化,这就叫做属性继承. Html 标记语言, 不是编程语言.说白了就是 ...

  9. DoTween 动画插件简单示例

    .doTween的静态方法 DOTween.To(() => maskImage.color, toColor => maskImage.color = toColor, , , , ), ...

  10. phpstudy 产生You don't have permission to access / on this server.解决

    phpstudy配置好访问目录时候有时候会产生You don't have permission to access / on this server. 解决办法: 修改服务器httpd.conf配置 ...