SqlServer 触发器实现多表之间同步增加、删除与更新
定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。
常见的触发器有三种:分别应用于Insert , Update , Delete 事件。
触发器的使用模版如下
CREATE TRIGGER 触发器名称 ON 表名称AFTER INSERT /UPDATE/DELETEAS BEGIN INSERT INTO B表(B表字段1,B表字段2,B表字段3)SELECT A表字段1,A表字段2,A表字段3 FROM INSERTED/DELETEDEND
新建两张表,如下,第一张是操作表,第二张表是为了测试触发器效果的
create table dbo.testtable(id int identity (1,1),name varchar(20))create table dbo.htesttable(id int identity (1,1),name varchar(20),timerecord datetime,updatedt datetime)
新增的触发器
CREATE TRIGGER [DBO].[TRG_TESTTABLE_INSERT] ON [DBO].[TESTTABLE] AFTER INSERT ASBEGININSERT INTO HTESTTABLE SELECT I.NAME+'INSERT' ,GETDATE(),GETDATE()FROM INSERTED I END
更新的触发器
ALTER/Create TRIGGER [dbo].[TRG_TESTTABLE_update] ON [dbo].[testtable] AFTER update ASBEGININSERT INTO HTESTTABLE SELECT I.NAME + 'update',getdate(),getdate()FROM deleted I INSERT INTO HTESTTABLE SELECT I.NAME + 'update2',getdate(),getdate() FROM inserted I END
解释:
在删除(delete)数据的时候,可以假定数据库将要删除的数据放到一个deleted临时表中,我们可以向读取普通的表一样,select 字段 from deleted而insert的时候道理一样,只不过是把要插入的数据放在inserted表中。更新操作可以认为是执行了两个操作,先把那一行记录delete掉,然后再insert,
这样update操作实际上就对deleted表和inserted表的操作,所以不会有updated表了;有的时候两个表是主外键关系,想删除主表数据的同时把子表相关的数据也删除,
这个时候如果用触发器就没有效果了,因为这个触发器是在你删除表后才触发的,这个时候直接终止,提示“有主外键关系,不能删除等”,所有这样的删除触发器是没有效果的
删除的触发器
CREATE TRIGGER [DBO].[TRG_TESTTABLE_DELETE] ON [DBO].[TESTTABLE] AFTER DELETE ASBEGININSERT INTO HTESTTABLE SELECT D.NAME + 'DELETE',GETDATE(),GETDATE()FROM DELETED D END
如果需要对触发器重命名,只要记住触发器是特殊的存储过程即可,命令如下
exec sp_rename oldxxx, newxxx
如何查询触发器
SELECT * FROM SYSOBJECTS WHERE XTYPE='TR'
禁用:alter table 表名 disable trigger 触发器名称
启用:alter table 表名 enable trigger 触发器名称