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;