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

SQLServer-トリガーの挿入後-同じテーブルの別の列を更新します

    これは、現在DBに設定されているトリガーの再帰レベルによって異なります。

    これを行う場合:

    SP_CONFIGURE 'nested_triggers',0
    GO
    RECONFIGURE
    GO
    

    またはこれ:

    ALTER DATABASE db_name
    SET RECURSIVE_TRIGGERS OFF
    

    上記のトリガーは再度呼び出されることはなく、安全です(ある種のデッドロックに陥らない限り、それは可能かもしれませんが、私は間違っているかもしれません)。

    それでも、私はしません これは良い考えだと思います。より適切なオプションは、INSTEADOFトリガー を使用することです。 。そうすれば、DBに対して最初の(手動の)更新を実行することを回避できます。トリガー内で定義されたものだけが実行されます。

    INSTEAD OF INSERTトリガーは次のようになります:

    CREATE TRIGGER setDescToUpper ON part_numbers
    INSTEAD OF INSERT
    AS
    BEGIN
        INSERT INTO part_numbers (
            colA,
            colB,
            part_description
        ) SELECT
            colA,
            colB,
            UPPER(part_description)
        ) FROM
            INSERTED
    END
    GO
    

    これにより、元のINSERTステートメントが自動的に「置き換え」られ、明示的なUPPER呼び出しがpart_descriptionに適用されます。 フィールド。

    INSTEAD OF UPDATEトリガーも同様です(単一のトリガーを作成することはお勧めしません。それらを分離しておいてください)。

    また、これは@Martinコメントに対応しています。複数行の挿入/更新で機能します(例では機能しません)。



    1. djangoのランタイム警告

    2. 文字列/varcharをMySQLテーブル間で日付に変換する

    3. ユーザーがリンクをクリックしたときにテーブルに新しいフィールドを作成する方法

    4. SequelizewithDatesでOp.betweenを使用するとTypeScriptエラーが発生します