Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Instruction SQL du déclencheur DML

Comme le dit Jonas, Profiler est votre meilleure option (et la seule option pour les requêtes SELECT). Pour INSERT, UPDATE, DELETE, le plus proche que vous pouvez obtenir sans Profiler peut être de regarder le tampon d'entrée via DBCC INPUTBUFFER(@@SPID) . Cela ne fonctionnera que pour les événements de langage ad hoc, pas les appels RPC, et ne vous montrera que les 256 premiers caractères de l'instruction SQL (selon la version, je crois). Quelques exemples de code, (exécutés en tant que 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