zoukankan      html  css  js  c++  java
  • SqlServer触发器判断对表操作类型(增、删、改)并将修改后的数据映射到新表

    该文章为原创,日后可能会根据实际开发经验和网友评论,进行相应地方修改,为获得最新博客动态,望在转发博客的时候注明出处。

    触发器要实现的功能:

    (1)获取对表Table1数据操作操作类型(insert、delete或update)。

    (2)将表修改后的数据保存到表Table2(该表结构与Table1表结构类似)。

    例如:

    1>向表Table1添加数据1,表保存后,将数据1添加到表Table2,并将操作类型:insert,保存到表Table2的ChangeType列。

    2>修改表Table1,将数据1改成数据2,表保存后,将数据2添加到表Table2,并将操作类型:update,保存到表Table2的ChangeType列。

    3>删除表Table1数据1,表保存后,将数据2添加到表Table2,并将操作类型:delete,保存到表Table2的ChangeType列。

    表结构:

    (1)表Table1

    1 CREATE TABLE Table1(
    2     [ID] [BIGINT] IDENTITY(1,1) NOT NULL,
    3     [Name] [NVARCHAR](20) NULL,
    4     [Sex] [NVARCHAR](2) NULL,
    5     [Address] [NVARCHAR](50) NULL,
    6     [Age] [INT] NULL,
    7     [Birthday] [DATE] NULL
    8 ) ON [PRIMARY]

    (2)表Table2

    1 CREATE TABLE Table2(
    2      [ID] [BIGINT] IDENTITY(1,1) NOT NULL,
    3      [Name] [NVARCHAR](20) NULL,
    4      [Sex] [NVARCHAR](2) NULL,
    5      [Address] [NVARCHAR](50) NULL,
    6      [Age] [INT] NULL,
    7      [Birthday] [DATE] NULL8      [ChangeType] [NVARCHAR](50) NOT NULL
    9  ) ON [PRIMARY]

    触发器Tri_Table1

     1 CREATE  TRIGGER [Tri_Table1] ON [Table1]
     2     --After触发器,对表进行insert、delete、update后触发
     3     AFTER INSERT, DELETE, UPDATE 
     4 AS
     5     BEGIN
     6         BEGIN TRY
     7             BEGIN TRAN;
     8             DECLARE @maxID NVARCHAR(50) ,
     9                 @inserted INT ,
    10                 @deleted INT ,
    11                 @ChangeType NVARCHAR(20);
    12             SELECT  @inserted = COUNT(1)
    13             FROM    Inserted;
    14             SELECT  @deleted = COUNT(1)
    15             FROM    Deleted;
    16             --判断对表Table1的操作类型
    17             IF @inserted > 0
    18                 AND @deleted = 0
    19                 BEGIN 
    20                     SET @ChangeType = 'INSERT';
    21                 END;
    22             ELSE
    23                 IF @inserted > 0
    24                     AND @deleted > 0
    25                     BEGIN 
    26                         SET @ChangeType = 'UPDATE';
    27                     END;
    28                 ELSE
    29                     IF @inserted = 0
    30                         AND @deleted > 0
    31                         BEGIN 
    32                             SET @ChangeType = 'DELETE';
    33                         END;
    34             IF @ChangeType = 'DELETE'
    35                 BEGIN
    36                     SELECT  @maxID = Id
    37                     FROM    Deleted;
    38                     --如果对Table1同一条数据,进行多次操作,则Table2只保存最新数据    
    39                     IF EXISTS ( SELECT  COUNT(1)
    40                                 FROM    Table2
    41                                 WHERE   Id = @maxID )
    42                         BEGIN 
    43                             DELETE  FROM Table2
    44                             WHERE   Id = @maxID;    
    45                         END;
    46                     INSERT  INTO Table2
    47                             ( 
    48                             )
    49                             SELECT  ID,
    50                                     Name,
    51                                     Sex,
    52                                     Address,
    53                                     Age,
    54                                     Birthday,
    55                                     @ChangeType AS ChangeType   
    56                             FROM    Deleted;
    57                 END;
    58              ELSE
    59                 BEGIN
    60                     SELECT  @maxID = Id
    61                     FROM    Inserted;    
    62                     IF EXISTS ( SELECT  COUNT(1)
    63                                 FROM    Table2
    64                                 WHERE   Id = @maxID )
    65                         BEGIN 
    66                             DELETE  FROM Table2
    67                             WHERE   Id = @maxID;    
    68                         END;
    69                     INSERT  INTO Table2
    70                             ( 
    71                                 ID,
    72                                 Name,
    73                                 Sex,
    74                                 Address,
    75                                 Age,
    76                                 Birthday,
    77                                 ChangeType
    78                             )
    79                             SELECT  ID,
    80                                     Name,
    81                                     Sex,
    82                                     Address,
    83                                     Age,
    84                                     Birthday,
    85                                     @ChangeType AS ChangeType                           
    86                             FROM    Inserted 
    87                 END;   
    88             COMMIT TRAN;
    89         END TRY
    90         BEGIN CATCH
    91             IF XACT_STATE() = -1
    92                 ROLLBACK TRAN;
    93         END CATCH;  
    94     END;
    95     
  • 相关阅读:
    cocos2d-x JS 定时器暂停方法
    cocos2d-x JS 本地玩家位置跟服务器玩家位置转换相关
    cocos creator 背景音乐音量和音效音量百分比设置
    iPhoneX快速适配,简单到你想哭。
    Cocos Creator Slider(进度条)的三种实现
    图片的本地存储和读取问题
    Creator仿超级玛丽小游戏源码分享
    cocos2d-x 贡献一个oss上传脚本
    Cocos Creator
    Cocos Creator cc.Node.点击事件
  • 原文地址:https://www.cnblogs.com/xinlj/p/5138974.html
Copyright © 2011-2022 走看看