sql >> Database >  >> RDS >> Sqlserver

SQL-instructie van DML-trigger

Zoals Jonas zegt, is Profiler uw beste optie (en enige optie voor SELECT-query's). Voor INSERT, UPDATE, DELETE's kun je het beste zonder Profiler komen door naar de invoerbuffer te kijken via DBCC INPUTBUFFER(@@SPID) . Dit werkt alleen voor ad-hoctaalgebeurtenissen, niet voor RPC-aanroepen, en toont alleen de eerste 256 tekens van de SQL-instructie (afhankelijk van de versie, geloof ik). Enkele voorbeeldcode, (uitvoeren als 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. Hoe kan ik deze query verbeteren om het gebruik van geneste weergaven te voorkomen?

  2. Miljoenen rijen verwijderen in MySQL

  3. Een resultaat beperken met PHP, zonder de LIMIT-clausule te gebruiken bij het ophalen van rijen in de databasequery?

  4. met behulp van OPGESLAGEN PROCEDURES:verschillende resultaten in mysqli->query(CALL select_procedure) VS mysqli->query(SELECT ...)