触发器:
触发器是一种特殊类型的存储过程,它不同于前面介绍过的存储过程。触发器主要是通过事件进行触发而
被执行的,而存储过程可以通过存储过程名称而被直接调用。触发器是一个功能强大的工具,它使每个站
点可以在有数据修改时自动强制执行其业务规则。触发器可以用于 SQL Server 约束、默认值和规则的完
整性检查。
触发器主要优点如下:
触发器是自动的:当对表中的数据作了任何修改(比如手工输入或者应用程序采取的操作)之后立即被激
活。
触发器可以通过数据库中的相关表进行层叠更改。
触发器可以强制限制,这些限制比用 CHECK 约束所定义的更复杂。
创建触发器 :
创建触发器应该考虑以下几个问题:
①CREATE TRIGGER 语句必须是批处理中的第一个语句。
②创建触发器的权限默认分配给表的所有者,且不能将该权限转给其他用户。
③触发器为数据库对象,其名称必须遵循标识符的命名规则。
④虽然触发器可以引用当前数据库以外的对象,但只能在当前数据库中创建触发器。
⑤虽然不能在临时表或系统表上创建触发器,但是触发器可以引用临时表。
⑥在含有用 DELETE 或 UPDATE 操作定义的外键的表中,不能定义 INSTEAD OF 和 INSTEAD OF UPDATE
触发器。
⑦虽然 TRUNCATE TABLE 语句类似于没有 WHERE 子句(用于删除行)的 DELETE 语句,但它并不会引发
DELETE 触发器,因为 TRUNCATE TABLE 语句没有记录。
⑧WRITETEXT 语句不会引发 INSERT 或 UPDATE 触发器。
⑨当创建一个触发器时必须指定: ⑴名称;⑵在其上定义触发器的表;⑶触发器将何时激发;⑷激活触
发器的数据修改语句。
使用CREATE TRIGGER命令创建触发器
其语法形式如下:
CREATE TRIGGER trigger_name
ON{table|view}
[WITHENCRYPTION]
{
{ { FOR | AFTER | INSTEAD OF } { [DELETE][,][ INSERT ] [ , ] [ UPDATE ] }
[WITHAPPEND]
[NOTFORREPLICATION]
AS
[{IFUPDATE(column)
[{AND|OR}UPDATE(column)]
[...n]
|IF(COLUMNS_UPDATED(){bitwise_operator}updated_bitmask)
{comparison_operator}column_bitmask[...n]
}]
sql_statement[...n]
}
}
创建了一个触发器,在 titles 表上创建一个插入、更新类型的触发器,其程序清单如下:
USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'reminder' AND type = 'TR')
DROP TRIGGER reminder
GO
CREATE TRIGGER reminder
ON titles
FOR INSERT, UPDATE
AS sql_statements
GO
触发器的应用 :
1. 使用INSERT触发器
INSERT触发器通常被用来更新时间标记字段,或者验证被触发器监控的字段中的数据满足要求的标准,以
确保数据完整性。
2. 使用UPDATE触发器
修改触发器和插入触发器的工作过程基本上一致,修改一条记录等于插入了一条新的记录并且删除一条旧
的记录。
3.使用DELETE触发器
DELETE触发器通常用于两种情况,第一种情况是为了防止那些确实需要删除但会引起数据一致性问题的记
录的删除。
第二种情况是执行可删除主记录的子记录的级联删除操作。可以使用这样的触发器从主销售记录中删除所
有的定单项。
使用嵌套的触发器
如果一个触发器在执行操作时引发了另一个触发器,而这个触发器又接着引发下一个触发器……这些触发
器就是嵌套触发器。触发器可嵌套至 32 层,并且可以控制是否可以通过"嵌套触发器"服务器配置选项进
行触发器嵌套。如果允许使用嵌套触发器,且链中的一个触发器开始一个无限循环,则超出嵌套级,而且
触发器将终止。在执行过程中,如果一个触发器修改某个表,而这个表已经有其它触发器,这是就要使用
嵌套触发器。
浙公网安备 33010602011771号
