2017-01-15 5 views
1

SQL Server 2016で一時テーブルを使用します。現在、一時テーブルではON DELETE CASCADEを使用できません。どのように行動を模倣するためのトリガーを実装できますか?アプリケーションでEntity Frameworkのナビゲーションプロパティを使用するため、外部キーを保持したいと考えています。ON DELETE CASCADEの代わりにSQL Serverトリガを実装するにはどうすればよいですか?

外部キー条件で削除文が機能しないため、アフタートリガーが動作しないと思います。

我々は次のような単純な状況があるとします。

enter image description here

  1. UserRole.UserId:User.Id
  2. への外部キー
  3. UserRole.RoleId:Role.Id
への外部キーを

Id == 2のロールを削除した場合、UserRoleの2番目と4番目の行を削除します。一時テーブルでON DELETE CASCADEを使用せずにこれを実装するにはどうすればよいですか?

+0

あなたは '代わりTriggers'のを聞いたことがあり、それをグーグル。 –

+0

はい、INSTEAD OFトリガーは、DMLロジックの無効化を避けるために、現行表または履歴表では許可されていません。 AFTERトリガーは現在の表でのみ許可されます。 DMLロジックの無効化を避けるため、ヒストリ表でブロックされます。 – cSteusloff

+0

これを考えてみましょう - トリガのようなものを介して 'ON DELETE CASCADE'を実装するのは簡単ではなかったのですが、Microsoftの開発者はなぜこのようなメカニズムを使って' ON DELETE CASCADE'を実装していないのでしょうか?試行する回避策には同様の制限が適用される可能性があります。 –

答えて

1

私はコメント欄で述べたようにあなたがInstead of Triggerが必要になります、このような何か......

CREATE TRIGGER tr_CascadeDelete_UserRole 
ON [Role] 
INSTEAD OF DELETE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    --** Delete Rows from [UserRole] table first 
    DELETE FROM [UserRole] 
    WHERE EXISTS (SELECT 1 
       FROM Deleted d 
       WHERE d.RoleID = [UserRole].RoleID) 

    --** Delete Rows from [Role] table first 
    DELETE FROM [Role] 
    WHERE EXISTS (SELECT 1 
       FROM Deleted d 
       WHERE d.RoleID = [Role].RoleID) 

END 
+0

一時テーブルに関する(https://msdn.microsoft.com/en-gb/library/mt604468.aspx) –

関連する問題