sqlserver的觸發器練習實例

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;
相關文章
相關標籤/搜索