来自DML触发器的SQL语句

时间:2009-12-15 11:17:38

标签: sql sql-server sql-server-2005 tsql

我怎么知道哪个sql语句通过触发器在表上选择,插入,更新和删除?

2 个答案:

答案 0 :(得分:4)

正如Jonas所说,Profiler是您的最佳选择(也是SELECT查询的唯一选择)。对于INSERT,UPDATE,DELETE,没有Profiler的最接近的可能是通过DBCC INPUTBUFFER(@@SPID)查看输入缓冲区。这只适用于ad-hoc语言事件,而不适用于RPC调用,并且只会显示SQL语句的前256个字符(我相信,这取决于版本)。一些示例代码(以dbo运行):

CREATE TABLE TBL (a int, b varchar(50))
go

INSERT INTO TBL SELECT 1,'hello'
INSERT INTO TBL SELECT 2,'goodbye'
go

GRANT SELECT, UPDATE ON TBL TO guest
go

CREATE TABLE AUDIT (    audittime datetime default(getdate())
                    ,   targettable sysname
                    ,   loginname sysname
                    ,   spid int
                    ,   sqltext nvarchar(max))
go

CREATE TRIGGER TR_TBL ON TBL FOR INSERT, UPDATE, DELETE
AS BEGIN
    CREATE TABLE #DBCC (EventType varchar(50), Parameters varchar(50), EventInfo nvarchar(max))

    INSERT INTO #DBCC
    EXEC ('DBCC INPUTBUFFER(@@SPID)')

    INSERT INTO AUDIT (targettable, loginname, spid, sqltext)
        SELECT  targettable =   'TBL'
        ,       suser       =   suser_name()
        ,       spid        =   @@SPID
        ,       sqltext     =   EventInfo 
        FROM #DBCC
END
GO

/* Test the Audit Trigger (can be run as guest) */
UPDATE TBL SET a = 3 WHERE a = 2

答案 1 :(得分:2)

首先,没有选择dml触发器,只有在INSERT,UPDATE或DELETE上工作的触发器

其次,您无法知道哪个sql语句触发了触发器(至少不在触发器中)。但是,您可以使用分析器来调试数据库中发生的情况。对此here有一个不错的解释。