Оператор SQL из триггера DML - PullRequest
       18

Оператор SQL из триггера DML

1 голос
/ 15 декабря 2009

Как узнать, какой SQL-оператор запустил триггер для выбора, вставки, обновления и удаления в таблице?

Ответы [ 2 ]

4 голосов
/ 16 декабря 2009

Как говорит Джонас, Profiler - ваш лучший вариант (и единственный вариант для запросов SELECT). Для INSERT, UPDATE, DELETE, самое близкое, что вы можете получить без Profiler, может быть просмотр буфера ввода через DBCC INPUTBUFFER(@@SPID). Это будет работать только для событий специального языка, а не вызовов RPC, и покажет вам только первые 256 символов оператора SQL (я полагаю, в зависимости от версии). Пример кода (запускается как 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 голосов
/ 15 декабря 2009

Во-первых, нет триггеров select dml, только триггеры, которые работают на INSERT, UPDATE или DELETE

Во-вторых, вы не можете знать, какой оператор sql вызвал триггер (по крайней мере, не в триггере). Однако вы можете использовать профилировщик для отладки того, что происходит в базе данных. Вот приличное объяснение этому здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...