https://www.cnblogs.com/julinhuitianxia/p/6823011.htmlhtml
https://www.cnblogs.com/xinlj/p/5138974.htmlui
触发器要实现的功能:url
(1)获取对表Table1数据操做操做类型(insert、delete或update)。spa
(2)将表修改后的数据保存到表Table2(该表结构与Table1表结构相似)。.net
例如:code
1>向表Table1添加数据1,表保存后,将数据1添加到表Table2,并将操做类型:insert,保存到表Table2的ChangeType列。htm
2>修改表Table1,将数据1改为数据2,表保存后,将数据2添加到表Table2,并将操做类型:update,保存到表Table2的ChangeType列。blog
3>删除表Table1数据1,表保存后,将数据2添加到表Table2,并将操做类型:delete,保存到表Table2的ChangeType列。get
表结构:it
(1)表Table1
CREATE TABLE Table1( [ID] [BIGINT] IDENTITY(1,1) NOT NULL, [Name] [NVARCHAR](20) NULL, [Sex] [NVARCHAR](2) NULL, [Address] [NVARCHAR](50) NULL, [Age] [INT] NULL, [Birthday] [DATE] NULL ) ON [PRIMARY]
(2)表Table2
CREATE TABLE Table2( [ID] [BIGINT] NOT NULL, [Name] [NVARCHAR](20) NULL, [Sex] [NVARCHAR](2) NULL, [Address] [NVARCHAR](50) NULL, [Age] [INT] NULL, [Birthday] [DATE] NULL, [ChangeType] [NVARCHAR](50) NOT NULL ) ON [PRIMARY]
触发器Tri_Table1
CREATE TRIGGER [Triger_Table1] ON [Table1] --After触发器,对表进行insert、delete、update后触发 AFTER INSERT, DELETE, UPDATE AS BEGIN BEGIN TRY BEGIN TRAN; DECLARE @maxID NVARCHAR(50) , @inserted INT , @deleted INT , @ChangeType NVARCHAR(20); SELECT @inserted = COUNT(1) FROM Inserted; SELECT @deleted = COUNT(1) FROM Deleted; --判断对表Table1的操做类型 IF @inserted > 0 AND @deleted = 0 BEGIN SET @ChangeType = 'INSERT'; END; ELSE IF @inserted > 0 AND @deleted > 0 BEGIN SET @ChangeType = 'UPDATE'; END; ELSE IF @inserted = 0 AND @deleted > 0 BEGIN SET @ChangeType = 'DELETE'; END; IF @ChangeType = 'DELETE' BEGIN SELECT @maxID = ID FROM Deleted; --若是对Table1同一条数据,进行屡次操做,则Table2只保存最新数据 IF EXISTS ( SELECT COUNT(1) FROM Table2 WHERE ID = @maxID ) BEGIN DELETE FROM Table2 WHERE ID = @maxID; END; INSERT INTO Table2 ( ID, Name, Sex, Address, Age, Birthday, ChangeType ) SELECT ID, Name, Sex, Address, Age, Birthday, @ChangeType AS ChangeType FROM Deleted; END; ELSE BEGIN SELECT @maxID = ID FROM Inserted; IF EXISTS ( SELECT COUNT(1) FROM Table2 WHERE ID = @maxID ) BEGIN DELETE FROM Table2 WHERE ID = @maxID; END; INSERT INTO Table2 ( ID, Name, Sex, Address, Age, Birthday, ChangeType ) SELECT ID, Name, Sex, Address, Age, Birthday, @ChangeType AS ChangeType FROM Inserted END; COMMIT TRAN; END TRY BEGIN CATCH IF XACT_STATE() = -1 ROLLBACK TRAN; END CATCH; END;
下面是只有新增和修改的
CREATE TABLE Table1( [ID] [BIGINT] IDENTITY(1,1) NOT NULL, [Name] [NVARCHAR](20) NULL, [Sex] [NVARCHAR](2) NULL, [Address] [NVARCHAR](50) NULL, [Age] [INT] NULL, [Birthday] [DATE] NULL ) ON [PRIMARY]
CREATE TABLE Table2( [ID] [BIGINT] IDENTITY(1,1) NOT NULL, [Name] [NVARCHAR](20) NULL, [Sex] [NVARCHAR](2) NULL, [Address] [NVARCHAR](50) NULL, [Age] [INT] NULL, [Birthday] [DATE] NULL, [ChangeType] [NVARCHAR](50) NOT NULL ) ON [PRIMARY]
CREATE TRIGGER [Triger_Table1] ON [Table1] --After触发器,对表进行insert、delete、update后触发 AFTER INSERT, UPDATE AS BEGIN BEGIN TRY BEGIN TRAN; DECLARE @maxID NVARCHAR(50) , @inserted INT , @deleted INT , @ChangeType NVARCHAR(20); SELECT @inserted = COUNT(1) FROM Inserted; SELECT @deleted = COUNT(1) FROM Deleted; --判断对表Table1的操做类型 IF @inserted > 0 AND @deleted = 0 BEGIN SET @ChangeType = 'INSERT'; END; ELSE IF @inserted > 0 AND @deleted > 0 BEGIN SET @ChangeType = 'UPDATE'; END; BEGIN INSERT INTO Table2 ( Name, Sex, Address, Age, Birthday, ChangeType ) SELECT Name, Sex, Address, Age, Birthday, @ChangeType AS ChangeType FROM Inserted END; COMMIT TRAN; END TRY BEGIN CATCH IF XACT_STATE() = -1 ROLLBACK TRAN; END CATCH; END;