有时我们需要监测某个表的字段到底是被谁在什么时候操作的,这个时候就可以做个特殊的触发器来监测。
/*=========================================
创建测试表test
=========================================*/
CREATE TABLE test(Id INT IDENTITY(1,1),Code VARCHAR(20))
/*=========================================
插入测试数据
=========================================*/
INSERT Test (Code)
VALUES ('001')
/*=========================================
创建日志记录表
=========================================*/
CREATE TABLE Test_Log(Id INT IDENTITY(1,1),AppName VARCHAR(200),SQL VARCHAR(max),UserName VARCHAR(30),HostName VARCHAR(100),UpdateTime DateTime)
/*=========================================
创建跟踪表状态触发器
=========================================*/
CREATE TRIGGER [dbo].[Trigger_Test] ON [dbo].[test]
FOR UPDATE
AS
SET NOCOUNT ON
--用临时表保存exec('DBCC INPUTBUFFER...')的返回值
CREATE TABLE #t
(
EventType VARCHAR(50) ,
Parameters INT ,
EventInfo VARCHAR(6000)
)
--DBCC INPUTBUFFER需要参数spid
DECLARE @spid VARCHAR(20)
SET @spid = CAST(@@spid AS VARCHAR)
INSERT #t
EXEC ( 'DBCC INPUTBUFFER (' + @spid + ')'
)
INSERT Test_Log
( AppName ,
SQL ,
UserName ,
HostName ,
UpdateTime
)
SELECT APP_NAME() , --应用程序名,比较有用,你可以发现是否有用查询分析器修改数据的
EventInfo , -- SQL语句,主要用来发现程序错误
SYSTEM_USER , --用户名
HOST_NAME() , --主机名
GETDATE() --发生时间
FROM #t
GO