sql >> Base de Datos >  >> RDS >> Sqlserver

Declaración SQL del disparador DML

Como dice Jonas, Profiler es su mejor opción (y la única opción para consultas SELECT). Para INSERTAR, ACTUALIZAR, ELIMINAR, lo más cercano que puede obtener sin Profiler puede ser mirar el búfer de entrada a través de DBCC INPUTBUFFER(@@SPID) . Esto solo funcionará para eventos de lenguaje ad-hoc, no llamadas RPC, y solo le mostrará los primeros 256 caracteres de la declaración SQL (según la versión, creo). Algún código de ejemplo, (ejecutar como 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