私は自分の問題を表すためにわざとこの例を作成しました。
私はこのようなテーブルを作成しました:
CREATE TABLE a
(
id INT
)
次に、2 AFTER TRIGGERを次のように作成しました。
CREATE TRIGGER insert_a
ON a AFTER INSERT
AS
BEGIN
INSERT INTO a VALUES (1)
END
GO
CREATE TRIGGER insert_a2
ON a AFTER INSERT
AS
BEGIN
INSERT INTO a VALUES(2)
END
GO
その後、私はテーブルに挿入しました:
INSERT INTO a VALUES (0)
私は結果を得ました:
メッセージ217、レベル16、状態1、プロシージャinsert_a2、行5 [バッチ開始行0]。
ストアドプロシージャ、関数、トリガー、またはビューのネストレベルが最大値を超えています(制限32)。
ここには循環的な状況があると思います。トリガー内での挿入は、トリガーを発射します。それは起こりますか?
内部で何が起こっているのか知りたいのですが?
この問題を解決する方法はありますが、そのまま2 AFTER INSERTトリガーを保持しますか?
クレイジーな状況。
問題は、SQL Serverのネストされたトリガーの概念に関連しています。この概念は [〜#〜] msdn [〜#〜] で以下のように説明されています
トリガーが別のトリガーを開始するアクションを実行すると、DMLトリガーとDDLトリガーの両方がネストされます。これらのアクションは、他のトリガーなどを開始できます。 DMLおよびDDLトリガーは、最大32レベルまでネストできます。
特にあなたの問題はnested_triggers
configを0にして、トリガーが1回だけ実行されるようにします。
最初に、nested_triggers
値としての0
。ただし、このオプションは、この点を考慮してサーバーレベルにあります。
sp_CONFIGURE 'nested_triggers',0
GO
RECONFIGURE
GO
次に、クエリを再実行します。aの結果セットは、次のようになります。
+----+
| id |
+----+
| 0 |
| 2 |
| 1 |
+----+