sql >> Databáze >  >> RDS >> Sqlserver

Příkaz SQL z DML Trigger

Jak říká Jonas, Profiler je vaše nejlepší volba (a jediná možnost pro SELECT dotazy). V případě INSERT, UPDATE, DELETE se můžete bez Profileru nejblíže podívat na vstupní vyrovnávací paměť pomocí DBCC INPUTBUFFER(@@SPID) . Toto bude fungovat pouze pro ad-hoc jazykové události, nikoli RPC volání, a zobrazí vám pouze prvních 256 znaků příkazu SQL (v závislosti na verzi, věřím). Nějaký příklad kódu (spustit jako 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. Jak ovladače JDBC zpracovávají typy dat?

  2. Jak najdu všechny tabulky, které mají cizí klíče, které odkazují na konkrétní table.column A mají hodnoty pro tyto cizí klíče?

  3. Omezte připojení k serveru SQL na konkrétní IP adresu

  4. 2 způsoby převodu mezi desítkovou a šestnáctkovou v MySQL