Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
来自DML触发器的SQL语句_Sql_Sql Server_Sql Server 2005_Tsql - Fatal编程技术网

来自DML触发器的SQL语句

来自DML触发器的SQL语句,sql,sql-server,sql-server-2005,tsql,Sql,Sql Server,Sql Server 2005,Tsql,如何知道通过触发器为表上的select、insert、update和delete触发了哪个sql语句?首先,没有select dml触发器,只有对insert、update或delete起作用的触发器 其次,您不知道是哪个sql语句触发了触发器(至少不在触发器中)。但是,您可以使用探查器来调试数据库中发生的事情。对此有一个合理的解释。首先,没有select dml触发器,只有可用于INSERT、UPDATE或DELETE的触发器 其次,您不知道是哪个sql语句触发了触发器(至少不在触发器中)。但

如何知道通过触发器为表上的select、insert、update和delete触发了哪个sql语句?

首先,没有select dml触发器,只有对insert、update或delete起作用的触发器


其次,您不知道是哪个sql语句触发了触发器(至少不在触发器中)。但是,您可以使用探查器来调试数据库中发生的事情。对此有一个合理的解释。

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


其次,您不知道是哪个sql语句触发了触发器(至少不在触发器中)。但是,您可以使用探查器来调试数据库中发生的事情。对此有一个很好的解释。

正如乔纳斯所说,探查器是您最好的选择(也是选择查询的唯一选择)。对于INSERT、UPDATE、DELETEs,在没有探查器的情况下,最接近的方法可能是通过
DBCC INPUTBUFFER(@@SPID)
查看输入缓冲区。这只适用于特殊语言事件,而不适用于RPC调用,并且只显示SQL语句的前256个字符(我相信这取决于版本)。一些示例代码(作为dbo运行):


正如Jonas所说,分析器是您最好的选择(也是选择查询的唯一选择)。对于INSERT、UPDATE、DELETEs,在没有探查器的情况下,最接近的方法可能是通过
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