sql >> データベース >  >> RDS >> Sqlserver

DML トリガーからの SQL ステートメント

    Jonas が言うように、Profiler が最良のオプションです (そして SELECT クエリの唯一のオプションです)。 INSERT、UPDATE、DELETE の場合、プロファイラーなしで取得できる最も近い方法は、DBCC INPUTBUFFER(@@SPID) を介して入力バッファーを調べることです。 .これは、RPC 呼び出しではなく、アドホック言語イベントでのみ機能し、SQL ステートメントの最初の 256 文字のみを表示します (バージョンによって異なります)。コード例 (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. WordPressエディターがファイルを更新しない:致命的なエラーをチェックするためにサイトと通信できません

    2. このMySQLストアド関数がクエリで計算を行うのとは異なる結果をもたらすのはなぜですか?

    3. OracleのBITAND()関数

    4. すでに閉じられているオブジェクトsqlitedatabaseを再度開こうとします