触发器是一种特殊类型的存储过程,与表格紧密相连。
触发器的一般功能如下:
(1)级联修改数据库中的表。
(2)执行比检查约束更为复杂的约束操作。
(3)拒绝或回绝违反引用完整性的操作。
(4)比较表修改前后数据之间的区别。
创建触发器前,需遵守以下规则:
(1)CREATE TRIGGER 语句必须是批处理中的第一个语句,且改批处理中随后出现的其他所有语句都将被解释为CREATE TRIGGER语句定义的一部分。
(2)每一个触发器都是一个数据对象,因此其名称必须遵守标识符的命名规则。
(3)在默认情况下,创建触发器的权限讲分配给数据表的所有者,且不可以讲该权限转移给其他用户。
(4)虽然触发器可引用当前数据库以外的对象,但只能在当前数据库中创建触发器。
(5)虽然不能在临时数据表上创建触发器,但可引用临时数据表。
(6)既不能在系统数据表中创建触发器,也不可以引用系统数据表。
(7)在包含使用DELETE或UPDATE操作所定义的外键的表中,不能定义INSTEAD OF 和 INSTEAD OF UPDATE。
(8)虽然TRUNCATE TABLE 语句类似于不包含 where 子句的DELETE语句,但它不会引发DELETE触发器。
(9)WRITETEXT语句不会引发INSERT或UPDATE触发器。
(10)下面的语句不能创建触发器:ALERT DATABASE,CREATE DATABASE,DISK INIT,DISK INSIZE,DROP DATABASE,LOAD DATABASE,LOAD LOG,RECONFIGURE,RESTORE DATABASE,RESTORE LOG。
创建触发器格式如下:
CREATE TRIGGER[owner,]trigger_name
On[owner,]table_name
[WITH ENCRYPTION]
{
FOR{[INSERT][,UPDATE][,DELETE]}
[NOT FORREPLICATION]
AS sql_statements
}
在上述语句中:
① trigger_name:为创建的触发器名称,它必须遵守SQL Server的命名规则,而且同一个数据库中不允许出现触发器名称相同的情况。
② table_name:为该语句中定义的触发器所基于的表,也称为触发表。
⑧ WITH ENCRYPTION选项:SQL Server将触发器的定义文本保存在系统分类表 syscomments中,选用此项要求SQL Server对该触发器定义文本进行加密存储,以防止第三方用户从syscomments表中读取该触发器定义文本的内容。
④ NOT FOR REPLICATION选项:说明在复制过程中出现修改触发表数据时,触发器不被激活。
⑤ FOR{[INSERT][,UPDATE][,DELETE]}:定义触发器的触发事件。当某一个触发器由表中的多个事件触发时,可以在INSERT、UPDATE、DELETE之间使用“,”符号作为间隔符来组合表示。
⑥sql_statements:定义触发器在触发事件发生时(被激活时)所要执行的操作。
创建触发器的第二种定义格式中的触发事件仅限于INSERT和UPDATE。其语法格式为:
CREATE TRIGGER[owner,]trigger_name
On[owner,]table_name
[WITH ENCRYPTION]
{
FOR{[INSERT][,UPDATE]}
[NOT FOR REPLICATION]
AS
{IF UPDATE(column)
[{AND|OR}UPDATE(column)]
|
IF(COLUMNS UPDATED(){bitwise_operator}updated_bitmask
{comparison_operator column_bitmask}
sql_statements
}
}
在第二种格式中,需要用IF子句进一步说明触发器的触发条件仅限于IF语句中指定的列值被修改。IF子句指定的被修改列有以下两种格式:
IF UPDATE(column)[{AND|OR}UPDATE(column)]
和
IF(COLUMNS_UPDATED(){位运算符)updated_bitmask(L[较运算符 column_bitmask)其中:
①column:指明激活触发器的触发条件中其数据将被INSERT或UPDATE操作修改的列。
②updated bitmask:定义了各位的位屏蔽值。
⑧column bitmask:定义了各待检测列的位屏蔽值的值。各列的屏蔽位为该列在触发表中的序号。
④COLUMNS_UPDATED():用来检测指定列的列值是否被插入或修改。需要用位运算符、比较运算符和 updated_bitmask(各位的位屏蔽值)、column__bitmask(各待检测列的位屏蔽值的值)等几个参数一起说明待检测列。假如一个触发表中有5个待检测列,则各列对应的屏蔽位为1~5,对应的位屏蔽值为20~24。例如,要在触发器中检测列1和列3的列值是否被修改的IF子句为: IF(COLUMNS UPDATED()&(1+4))<>0
注意:在使用WITH ENCRYPTION选项时需要注意两点:一是原始触发器的文件丢失,将不能从syscomments表中重新保存加密文本;二是文本加密后,在数据库升级为新版本时不能修改,也不能重新存入新版本中。也就是说,如果触发器文本有可能需要修改,就不要随便将其加密。
【例】创建一个触发器,当新增一条学生记录时打印信息
IF EXISTS(SELECT name FROM sysobjects where name='stu_tr' and type='TR' )
DROP TRIGGER stu_tr
GO
CREATE TRIGGER stu_tr ON dbo.student
FOR INSERT
AS
PRINT '新增一位学生'
GO
INSERT dbo.student VALUES('CC','女','C1',20)
GO
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com