-
sql语句大全之SQL Server “复制”表结构,创建_L
实例效果:
实现表数据的增修删时,记录日志。
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
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式