来自DML触发器的SQL语句
如何知道通过触发器为表上的select、insert、update和delete触发了哪个sql语句?首先,没有select dml触发器,只有对insert、update或delete起作用的触发器来自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语句触发了触发器(至少不在触发器中)。但
其次,您不知道是哪个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