【发布时间】:2023-04-08 00:49:01
【问题描述】:
我如何知道哪个 sql 语句通过触发器触发了对表的选择、插入、更新和删除?
【问题讨论】:
标签: sql sql-server sql-server-2005 tsql
我如何知道哪个 sql 语句通过触发器触发了对表的选择、插入、更新和删除?
【问题讨论】:
标签: sql sql-server sql-server-2005 tsql
正如 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
【讨论】:
首先,没有 select dml 触发器,只有适用于 INSERT、UPDATE 或 DELETE 的触发器
其次,你无法知道是哪个sql语句触发了触发器(至少在触发器中没有)。但是,您可以使用分析器来调试数据库中发生的事情。 here 有一个不错的解释。
【讨论】: