Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Istruzione SQL da DML Trigger

Come dice Jonas, Profiler è la tua migliore opzione (e l'unica opzione per le query SELECT). Per INSERT, UPDATE, DELETE, il più vicino che puoi ottenere senza Profiler potrebbe essere guardare il buffer di input tramite DBCC INPUTBUFFER(@@SPID) . Funzionerà solo per eventi linguistici ad hoc, non per chiamate RPC, e ti mostrerà solo i primi 256 caratteri dell'istruzione SQL (a seconda della versione, credo). Qualche codice di esempio, (eseguito come 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