SQLServer触发器实例详解
Microsoft SQL Server™ 2000 提供了两种主要机制来强制业务规则和数据完整性:约束和触发器。触发器是⼀种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。触发器主要是通过事件进⾏
触发被⾃动调⽤执⾏的。⽽存储过程可以通过存储过程的名称被调⽤。
Ø 什么是触发器
sqlserver备份表语句触发器对表进⾏插⼊、更新、删除的时候会⾃动执⾏的特殊存储过程。触发器⼀般⽤在check约束更加复杂的约束上⾯。触发器和普通的存储过程的区别是:触发器是当对某⼀个表进⾏操作。诸如:
update、insert、delete这些操作的时候,系统会⾃动调⽤执⾏该表上对应的触发器。SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语⾔
语句⽽激发,这些语句有create、alter、drop语句。
优点
触发器可通过数据库中的相关表实现级联更改;通过级联引⽤完整性约束可以更有效地执⾏这些更改。
触发器可以强制⽐⽤ CHECK 约束定义的约束更为复杂的约束。
与 CHECK 约束不同,触发器可以引⽤其它表中的列。例如,触发器可以使⽤另⼀个表中的 SELECT ⽐较插⼊或更新的数据,以及执⾏其它操作,如修改数据或显⽰⽤户定义错误信息。
触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。
DML触发器分为:
1、 after触发器(之后触发)
a、 insert触发器
b、 update触发器
c、 delete触发器
2、 instead of 触发器(之前触发)
其中after触发器要求只有执⾏某⼀操作insert、update、delete之后触发器才被触发,且只能定义在表上。⽽instead of触发器表⽰并不执⾏其定义的操作(insert、update、delete)⽽仅是执⾏触发器本
⾝。既可以在表上定义instead of触发器,也可以在视图上定义。
触发器有两个特殊的表:插⼊表(instered表)和删除表(deleted表)。这两张是逻辑表也是虚表。有系统在内存中创建者两张表,不会存储在数据库中。⽽且两张表的都是只读的,只能读取数据⽽不
能修改数据。这两张表的结果总是与被改触发器应⽤的表的结构相同。当触发器完成⼯作后,这两张表就会被删除。Inserted表的数据是插⼊或是修改后的数据,⽽deleted表的数据是更新前的或是删除
的数据。
Update数据的时候就是先删除表记录,然后增加⼀条记录。这样在inserted和deleted表就都有update后的数据记录了。注意的是:触发器本⾝就是⼀个事务,所以在触发器⾥⾯可以对修改数据进⾏⼀些
特殊的检查。如果不满⾜可以利⽤事务回滚,撤销操作。
Ø 创建触发器
语法
create trigger tgr_nameon table_namewith encrypion –加密触发器 as Transact-SQL
# 创建insert类型触发器
--创建insert插⼊类型触发器if (object_id('tgr_classes_insert', 'tr') is not null) drop trigger tgr_classes_insertgocreate trigger tgr_classes_inserton classes for insert --插⼊触发as --定义变量 declare @id int, @name varchar(20), @temp int; --在inserted表中查询已经插
insert触发器,会在inserted表中添加⼀条刚插⼊的记录。
# 创建delete类型触发器
--delete删除类型触发器if (object_id('tgr_classes_delete', 'TR') is not null) drop trigger tgr_classes_deletegocreate trigger tgr_classes_deleteon classes for delete --删除触发as print '备份数据中……'; if (object_id('classesBackup', 'U') is not null) --存在classesBacku delete触发器会在删除数据的时候,将刚才删除的数据保存在deleted表中。
# 创建update类型触发器
--update更新类型触发器if (object_id('tgr_classes_update', 'TR') is not null) drop trigger tgr_classes_updategocreate trigger tgr_classes_updateon classes for updateas declare @oldName varchar(20), @newName varchar(20); --更新前的数据 select @oldName = n update触发器会在更新
数据后,将更新前的数据保存在deleted表中,更新后的数据保存在inserted表中。
# update更新列级触发器
if (object_id('tgr_classes_update_column', 'TR') is not null) drop trigger tgr_classes_update_columngocreate trigger tgr_classes_update_columnon classes for updateas --列级触发器:是否更新了班级创建时间 if (update(createDate)) begin raisError('系统提⽰:班级更新列级触发器可以⽤update是否判断更新列记录;
# instead of类型触发器
instead of触发器表⽰并不执⾏其定义的操作(insert、update、delete)⽽仅是执⾏触发器本⾝的内容。
创建语法
create trigger tgr_nameon table_namewith encryption instead as T-SQL
# 创建instead of触发器
if (object_id('tgr_classes_inteadOf', 'TR') is not null) drop trigger tgr_classes_inteadOfgocreate trigger tgr_classes_inteadOfon classes instead of delete/*, update, insert*/as declare @id int, @name varchar(20); --查询被删除的信息,病赋值 select @id = id, @nam # 显⽰⾃定义消息raiserror
if (object_id('tgr_message', 'TR') is not null) drop trigger tgr_messagegocreate trigger tgr_messageon student after insert, updateas raisError('tgr_message触发器被触发', 16, 10);go--testinsert into student values('lily', 22, 1, 7);update student set sex = 0 where na
# 修改触发器
alter trigger tgr_messageon studentafter deleteas raisError('tgr_message触发器被触发', 16, 10);go--testdelete from student where name = 'lucy';
# 启⽤、禁⽤触发器
--禁⽤触发器disable trigger tgr_message on student;--启⽤触发器enable trigger tgr_message on student;
# 查询创建的触发器信息
-
-查询已存在的触发器select * iggers;select * from sys.objects where type = 'TR';--查看触发器触发事件select te.* igger_events te iggers ton t.object_id = te.object_idwhere t.parent_class = 0 and t.name = 'tgr_valid_data';--查看创建# ⽰例,验证插⼊数据
if ((object_id('tgr_valid_data', 'TR') is not null)) drop trigger tgr_valid_datagocreate trigger tgr_valid_dataon studentafter insertas declare @age int, @name varchar(20); select @name = s.name, @age = s.age from inserted s; if (@age < 18) begin raisError('插⼊新
# ⽰例,操作⽇志
if (object_id('log', 'U') is not null) drop table loggocreate table log( id int identity(1, 1) primary key, action varchar(20), createDate datetime default getDate())goif (exists (select * from sys.objects where name = 'tgr_student_log')) drop trigger tgr_student_loggocreat 以上所述是⼩编给⼤家介绍的sql server触发器,希望对⼤家有所帮助,同时感谢⼤家⼀直以来对⽹站的⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论