• SQL Server “复制”表结构,创建_Log表及触发器


    实例效果:

    实现表数据的增修删时,记录日志。

    1.“复制”现有表,

       创建相应的_Log表;

     (注意点:

    通过select union all 的方式,避免了IDENTITY 的“复制”,
    即如果原表有 PK 如 ID Identity,_Log表 仅“复制”ID int,“不复制” Identity属性,
    以便 Insert Update Delete时,可以Insert到Log表。)

    2.对现有表,创建Insert,Update,Delete的触发器,

      并将相应数据 记录到对应的_Log表

    相应代码如下:

    BEGIN TRAN   
    BEGIN TRY  
    
    
    --定义TAB_CURSOR
    DECLARE TAB_CURSOR CURSOR read_only
    FOR
       SELECT name FROM SysObjects Where XType='U' 
      -- AND name = N'T01ConstItem' 
      and [name] <> N'dtproperties'
       ORDER BY Name;
    
    --打开
    OPEN TAB_CURSOR
    
    DECLARE @P_TabName NVARCHAR(200);
    DECLARE @P_TabName_Log NVARCHAR(200);
    DECLARE @P_Create_Log_Tab NVARCHAR(4000);
    DECLARE @P_Create_Trig_I NVARCHAR(4000);
    DECLARE @P_Create_Trig_U NVARCHAR(4000);
    DECLARE @P_Create_Trig_D NVARCHAR(4000);
    
    FETCH NEXT FROM TAB_CURSOR 
               INTO @P_TabName
    --循环
    WHILE (@@FETCH_STATUS <> -1)
    BEGIN
       IF (@@FETCH_STATUS <> -2)
        BEGIN   
        SET @P_TabName_Log = CONCAT(@P_TabName,N'_Log');
    
        SET @P_Create_Log_Tab = N' SELECT * ';
        SET @P_Create_Log_Tab = CONCAT(@P_Create_Log_Tab,N' ,N''I '' AS Action');
        SET @P_Create_Log_Tab = CONCAT(@P_Create_Log_Tab,N' ,Getdate() AS ActionDate ');
        SET @P_Create_Log_Tab = CONCAT(@P_Create_Log_Tab,N' INTO ');
        SET @P_Create_Log_Tab = CONCAT(@P_Create_Log_Tab,@P_TabName_Log );
        SET @P_Create_Log_Tab = CONCAT(@P_Create_Log_Tab,N' FROM  ' );
        SET @P_Create_Log_Tab = CONCAT(@P_Create_Log_Tab,@P_TabName);
        SET @P_Create_Log_Tab = CONCAT(@P_Create_Log_Tab,N' UNION ALL ');
        SET @P_Create_Log_Tab = CONCAT(@P_Create_Log_Tab,N' SELECT TOP (1) * ');
        SET @P_Create_Log_Tab = CONCAT(@P_Create_Log_Tab,N' ,N''I '' AS Action');
        SET @P_Create_Log_Tab = CONCAT(@P_Create_Log_Tab,N' ,Getdate() AS ActionDate ');
        SET @P_Create_Log_Tab = CONCAT(@P_Create_Log_Tab,N' FROM  ' );
        SET @P_Create_Log_Tab = CONCAT(@P_Create_Log_Tab,@P_TabName);
        SET @P_Create_Log_Tab = CONCAT(@P_Create_Log_Tab, N' WHERE 1=0 ; ');
    
        EXEC( @P_Create_Log_Tab);
    
        --SET @P_Create_Log_Tab = CONCAT(N' SET IDENTITY_INSERT ',@P_TabName_Log ,' ON '); 
        --EXEC( @P_Create_Log_Tab);
        
    
        SET @P_Create_Trig_I = N' create trigger ';
        SET @P_Create_Trig_I = CONCAT(@P_Create_Trig_I,N' trig_',@P_TabName,N'_I ');
        SET @P_Create_Trig_I = CONCAT(@P_Create_Trig_I,N' on ',@P_TabName,N' after INSERT as ');
        SET @P_Create_Trig_I = CONCAT(@P_Create_Trig_I, N' begin ');    
        SET @P_Create_Trig_I = CONCAT(@P_Create_Trig_I, N'insert into ',@P_TabName_Log );
        SET @P_Create_Trig_I = CONCAT(@P_Create_Trig_I,N' select * , N''I'',Getdate() from Inserted ; ' );
        SET @P_Create_Trig_I = CONCAT(@P_Create_Trig_I, N'end ');
    
        --select @P_Create_Trig_I;
    
        EXEC( @P_Create_Trig_I);
    
        SET @P_Create_Trig_U = N' create trigger ';
        SET @P_Create_Trig_U = CONCAT(@P_Create_Trig_U,N' trig_',@P_TabName,N'_U ');
        SET @P_Create_Trig_U = CONCAT(@P_Create_Trig_U,N' on ',@P_TabName,N' after UPDATE as ');
        SET @P_Create_Trig_U = CONCAT(@P_Create_Trig_U, N' begin ');
        SET @P_Create_Trig_U = CONCAT(@P_Create_Trig_U, N'insert into ',@P_TabName_Log );
        SET @P_Create_Trig_U = CONCAT(@P_Create_Trig_U,N' select * , N''UD'',Getdate() from Deleted ; ' );
        SET @P_Create_Trig_U = CONCAT(@P_Create_Trig_U, N'insert into ',@P_TabName_Log );
        SET @P_Create_Trig_U = CONCAT(@P_Create_Trig_U,N' select * , N''UI'',Getdate() from Inserted ; ' );
        SET @P_Create_Trig_U = CONCAT(@P_Create_Trig_U, N'end ');
        EXEC( @P_Create_Trig_U);
    
        SET @P_Create_Trig_U = N' create trigger ';
        SET @P_Create_Trig_U = CONCAT(@P_Create_Trig_U,N' trig_',@P_TabName,N'_D ');
        SET @P_Create_Trig_U = CONCAT(@P_Create_Trig_U,N' on ',@P_TabName,N' after DELETE as ');
        SET @P_Create_Trig_U = CONCAT(@P_Create_Trig_U, N' begin ');
        SET @P_Create_Trig_U = CONCAT(@P_Create_Trig_U, N'insert into ',@P_TabName_Log );
        SET @P_Create_Trig_U = CONCAT(@P_Create_Trig_U,N' select * , N''D'',Getdate() from Deleted ; ' );
        SET @P_Create_Trig_U = CONCAT(@P_Create_Trig_U, N'end ');
        EXEC( @P_Create_Trig_U);
    
        END
       FETCH NEXT FROM TAB_CURSOR INTO @P_TabName
    END
    
    --关闭
    CLOSE TAB_CURSOR
    --释放
    DEALLOCATE TAB_CURSOR
    
    COMMIT TRAN;  
    
    END TRY  
    BEGIN CATCH  
        SELECT ERROR_MESSAGE() AS ErrorMessage  
        ,ERROR_SEVERITY() AS ErrorSeverity  
        ,ERROR_STATE() AS ErrorState  
        ROLLBACK TRAN;  
    END CATCH  
  • 相关阅读:
    对象的深度复制和浅复制 (深度拷贝和浅拷贝)
    包容网关 Inclusive Gateway
    一文带你了解js数据储存及深复制(深拷贝)与浅复制(浅拷贝)
    撸一个简单的vue-router来剖析原理
    vue-组件化-插槽(slot)
    从0开始探究vue-组件化-组件之间传值
    从0开始探究vue-公共变量的管理
    从0开始探究vue-双向绑定原理
    【图机器学习】cs224w Lecture 16
    【图机器学习】cs224w Lecture 15
  • 原文地址:https://www.cnblogs.com/freeliver54/p/9069861.html
Copyright © 2020-2023  润新知