MS SQL通用表触发器(理论上是通用的)

适用于MS SQL的表触发器,理论上是通用的


/*
创建日期:2021年11月22日16:19:09
触发器·表触发器·通用
–新增为1–删除为2–修改为3
主要记录修改人的IP,执行时的SQL语句,执行时间,执行类型,把原表数据写入便于恢复数据;
注意:触发器不适用于数据量非常大的表,可能会影响效率。
建议:借鉴写自己更好的,别人的不一定适合自己实际,自己弄出更好的才最适合自己。
*/

DECLARE @TBNAME VARCHAR(100)
SET @TBNAME='t_xtcsi'
EXEC('
IF NOT EXISTS (SELECT * FROM SYSOBJECTS WHERE name=''TRI_'+@TBNAME+''')
SELECT '''' IP,'''' RunSQL,'''' RunTime,'''' RunType,* INTO TRI_'+@TBNAME+' FROM '+@TBNAME+' WHERE 1=2
ALTER TABLE TRI_' +@TBNAME+' ALTER COLUMN IP VARCHAR(100)
ALTER TABLE TRI_' +@TBNAME+' ALTER COLUMN RunSQL VARCHAR(MAX)
ALTER TABLE TRI_' +@TBNAME+' ALTER COLUMN RunTime DATETIME
ALTER TABLE TRI_' +@TBNAME+' ALTER COLUMN RunType VARCHAR(100)'
)
--EXEC('DROP TRIGGER IF EXISTS TRII_'+@TBNAME)
EXEC('
alter TRIGGER TRII_'+@TBNAME+'
ON '+@TBNAME+'
WITH ENCRYPTION
FOR INSERT,DELETE,UPDATE
AS
DECLARE @RUNSQL VARCHAR(MAX)
DECLARE @IP VARCHAR(1000)
SELECT @IP=CLIENT_NET_ADDRESS  FROM SYS.DM_EXEC_CONNECTIONS WHERE SESSION_ID = @@SPID
DECLARE @DI TABLE(ET VARCHAR(MAX),PT VARCHAR(MAX),EI VARCHAR(MAX))
INSERT INTO @DI EXEC(''DBCC INPUTBUFFER(@@SPID)'')
SET @RUNSQL=(SELECT TOP 1 ISNULL(EI,'''') FROM @DI)
DECLARE @I INT
SET @I=0
IF EXISTS ( SELECT 1 FROM INSERTED )   
 SET @I=1
IF EXISTS ( SELECT 1 FROM DELETED )       
 SET @I=@I+2
IF @I=1           
 INSERT INTO TRI_'+@TBNAME+' SELECT @IP,@RUNSQL,GETDATE(),''增加数据'',* FROM INSERTED
IF @I=2
 INSERT INTO TRI_'+@TBNAME+' SELECT @IP,@RUNSQL,GETDATE(),''删除数据'',* FROM DELETED
IF @I=3
BEGIN
 INSERT INTO TRI_'+@TBNAME+' SELECT @IP,@RUNSQL,GETDATE(),''修改数据前'',* FROM DELETED
 INSERT INTO TRI_'+@TBNAME+' SELECT @IP,@RUNSQL,GETDATE(),''修改数据后'',* FROM INSERTED
END
')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值