触发器(trigger)
是一种特殊的存储过程,可以用来对表实施复杂的完整性约束,保持数据的一致性。当触发器所保护的数据发生改变时,触发器会自动被激活,并执行触发器中所定义的相关操作,从而保证对数据的不完整性约束或不正确的修改。
SQL Server为每个触发器都创建了两个专用表:Inserted表和Deleted表。
这两个表由系统来维护﹐它们存在于内存中而不是在数据库中。这两个表的结构总是与被该触发器作用的表的结构相同。触发器执行 完成后﹐与该触发器相关的这两个表也被删除。
Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行。
Inserted表存放由于执行Insert或Update语句而要向表中插入的所有行。
Instead of 和 After触发器
(1)AFTER触发器:它是在执行INSERT、UPDATE、DELETE语句操作之后执行触发器操作。它主要是用于记录变更后的处理或检查,一旦发生错误,可以用Rollback Transaction语句来回滚本次扣件,不过不能对视图定义AFTER触发器。
(2)INSTEAD OF触发器:它在执行INSERT、UPDATE、DELETE语句操作之前执行触发器本身所定义的操作。而INSTEAD OF触发器是可以定义在视图上的。
下面用一个我学习的例子:
use TestA /* *在数据库TestA中向dbo.Tb_User插入数据时候同时向数据库TestB中的表dbo.Tb_BUser插入数据 */ if (object_id('insertbuserbyuser', 'TR') is not null) drop trigger insertbuserbyuser go create trigger insertbuserbyuser on dbo.Tb_User for insert as begin insert into [TestB].[dbo].[Tb_BUser] select tuname, tupwd,trealname,tsex from inserted end go /* *修改数据库TestA中dbo.Tb_User的数据时候同时修改数据库TestB中的表dbo.Tb_BUser数据 */ if (object_id('updatebuserbyuser', 'TR') is not null) drop trigger updatebuserbyuser go create trigger updatebuserbyuser on dbo.Tb_User for update as begin declare @otuid int SELECT @otuid=[tuid]FROM deleted update[TestB].[dbo].[Tb_BUser] set tuname=a.tuname, tupwd=a.tupwd,trealname=a.trealname,tsex=a.tsex from inserted a where [TestB].[dbo].[Tb_BUser].tuid=@otuid end go
数据库图: