【问题标题】:SQL Statement from DML Trigger来自 DML 触发器的 SQL 语句
【发布时间】:2023-04-08 00:49:01
【问题描述】:

我如何知道哪个 sql 语句通过触发器触发了对表的选择、插入、更新和删除?

【问题讨论】:

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


    【解决方案1】:

    正如 Jonas 所说,Profiler 是您的最佳选择(也是 SELECT 查询的唯一选择)。对于 INSERT、UPDATE、DELETE,在没有 Profiler 的情况下最接近的可能是通过 DBCC INPUTBUFFER(@@SPID) 查看输入缓冲区。这仅适用于临时语言事件,不适用于 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
    

    【讨论】:

      【解决方案2】:

      首先,没有 select dml 触发器,只有适用于 INSERT、UPDATE 或 DELETE 的触发器

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-13
        • 2021-02-25
        • 1970-01-01
        • 2010-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        相关资源
        最近更新 更多