web-dev-qa-db-ja.com

SQL Server-Tableには、テーブル自体に挿入するAFTER INSERTトリガーが多数あります

私は自分の問題を表すためにわざとこの例を作成しました。

私はこのようなテーブルを作成しました:

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トリガーを保持しますか?

クレイジーな状況。

2
Dunguyen

問題は、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 |
+----+
5
esat