ホームページ >データベース >mysql チュートリアル >SQL Server での再帰的トリガーを防ぐにはどうすればよいですか?

SQL Server での再帰的トリガーを防ぐにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-31 14:19:14625ブラウズ

How Can I Prevent Recursive Triggers in SQL Server?

SQL Server での再帰的トリガーの防止

SQL Server 2008 では、tblMedia テーブルのトリガー [dbo].[tblMediaAfterInsertOrUpdate] が誤って再帰的な動作を引き起こします。この動作は、トリガーがトリガーされ、その後トリガー自体がトリガーされた場合に発生します。

問題を理解するために、トリガーを調べてみましょう:

ALTER TRIGGER [dbo].[tblMediaAfterInsertOrUpdate]
ON [dbo].[tblMedia]
BEFORE INSERT, UPDATE
AS
BEGIN
    ...

挿入または更新後:トリガーは、挿入または更新がコミットされる前に実行されます。

潜在的再帰: トリガー内の update ステートメントは、tblMedia テーブルの変更を試みます。この変更により、同じトリガーが再びトリガーされ、無限ループが発生する可能性があります。

再帰の防止: この再帰的な動作を防ぐには、TRIGGER_NESTLEVEL() 関数を使用してネスト レベルをチェックします。トリガーの。ネスト レベルが 1 より大きい場合、トリガーは別のトリガーによって呼び出されているため、スキップする必要があります。

ALTER TRIGGER [dbo].[tblMediaAfterInsertOrUpdate]
ON [dbo].[tblMedia]
BEFORE INSERT, UPDATE
AS
BEGIN
    IF TRIGGER_NESTLEVEL() <= 1 /* Prevent recursion */
    BEGIN
        ...
    END
END

説明:

  • TRIGGER_NESTLEVEL () 関数は、ネストされたトリガー レベルの数を返します。現在のトリガーが最も外側のトリガー (最初に実行されるトリガー) の場合、ネスト レベルは 1 になります。
  • ネスト レベルが 1 より大きい場合、トリガーは別のトリガーによって呼び出されているため、スキップする必要があります。
  • ネストレベルが 1 の場合、トリガーは再帰的に呼び出されず、通常の処理を続行できます。

このチェックをトリガーに組み込むことで、無限に再帰することを防ぎ、必要なデータ変更が 1 回だけ実行されるようにします。

以上がSQL Server での再帰的トリガーを防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。