我怎么知道哪个sql语句通过触发器在表上选择,插入,更新和删除?
答案 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有一个不错的解释。