2012-04-24 12 views
0

LINQ-to-SQLで使用するSQL Serverデータベース内で自身を参照するテーブルがあります。LINQ-to-SQL:トリガーを使用した同じ参照制約

私は行の削除を処理するためにこのテーブルにトリガーを作成しました。

ALTER TRIGGER [dbo].[TrgDeleteCalculation] 
ON [dbo].[Calculation] 
INSTEAD OF DELETE 
AS 
BEGIN 
    DELETE FROM Calculation WHERE CalcParentId IN (SELECT CalculationId FROM deleted) 
    DELETE FROM Calculation WHERE CalculationId IN (SELECT CalculationId FROM deleted) 
END 

問題は、データモデルで削除を実行しようとしたときに発生します。

この場合、次の例外が発生します。 DELETE文がSAME TABLE REFERENCE制約 "FK_calculations_calculations"と競合しました。競合は、データベース "DesignDb"、テーブル "dbo.Calculation"、列 'CalcParentId'で発生しました。 ステートメントが終了しました。私は、トリガがトリガされていないと思われる

...

は、これはそうである、またはそれが何か他のものだろうか?

答えて

0

最初の削除クエリで削除している子レコードの1つが、別の子行の親行です。

は、この記事をチェックアウト:

Self referencing foreign-key constraints and delete

+0

は、トリガーはそのの世話をするべきではないでしょうか。私はトリガーは、子供の行が削除されたときにも実行され、その子レコードがすべて削除されると仮定します。単純な再帰(または少なくともそれはすべきです)。 –

+0

[BOL](http://msdn.microsoft.com/en-us/library/ms189799.aspx):テーブルに定義されたINSTEAD OFトリガが、通常INSTEAD OFトリガを発生させるテーブルに対してステートメントを実行する場合再度、トリガーは再帰的に呼び出されません。代わりに、テーブルにINSTEAD OFトリガがなく、制約操作の連鎖が開始され、AFTERトリガが実行された場合のように、文が処理されます。 –

+0

Ah、ok。私の場合、引き金はほとんど役に立たないのですか?私はすべての考えを後ろに残し、すべての行を再帰的に削除するためにSQL DataModelにLINQを使用することを検討しています... –

関連する問題