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

DML コマンドがストアド プロシージャから発行されたかどうかを明確に特定することはできますか?

    CONTEXT_INFO (Transact-SQL) を使用します .この手順では、何も記録しないようにトリガーに警告する値を設定します:

    --in the procedure doing the insert/update/delete
    
    DECLARE @CONTEXT_INFO  varbinary(128)
    SET @CONTEXT_INFO =cast('SkipTrigger=Y'+REPLICATE(' ',128) as varbinary(128))
    SET CONTEXT_INFO @CONTEXT_INFO
    
    --do insert/update/delete that will fire the trigger
    
    SET CONTEXT_INFO 0x0 
      

    トリガーで CONTEXT_INFO をチェックし、何かする必要があるかどうかを判断します:

    --here is the portion of the trigger to retrieve the value:
    
    IF CAST(CONTEXT_INFO() AS VARCHAR(128))='SkipTrigger=Y'
    BEGIN
        --log your data here
    END
      

    不正な挿入/更新/削除を行っているだけの人は CONTEXT_INFO を設定しておらず、トリガーは変更を記録します。テーブル名や @@SPID など、CONTEXT_INFO に入力した値に気を配ることができます。不正なコードが CONTEXT_INFO も使用しようとする可能性があると思われる場合。



    1. ALTERTABLEスクリプトのMySQL変数

    2. MySQLテーブルに名前を付けるための漢字の使用

    3. Oracleデータベースの例でのJava

    4. SELECT LAST_INSERT_ID()は直接MySQLクエリで機能しますが、断続的にPHPクエリでは機能しません