2011-01-18 5 views
0

私はヘッダと詳細テーブルを持っている状況があります。ディテール表には、カスケード削除を使用したヘッダー表との外部キー関係があります。既に削除されたヘッダテーブルからトリガ内のデータを検索する方法

詳細レコードが削除されると、トリガーを使用して他のテーブルを更新する必要があります。私が抱えている問題は、削除されたレコードの詳細テーブルだけでなく、ヘッダーテーブルからいくつかの情報を取得する必要があることです。詳細レコードとヘッダーレコードを削除すると、トリガーは正常に動作しているように見えます。ただし、カスケード削除のために詳細レコードを削除するヘッダーレコードを削除すると、トリガーが実行されるときにヘッダーレコードが既に削除されており、必要な情報にアクセスできなくなります。

私はトリガーには新しかったので、わからないことがあるのか​​、これをどのように達成するのかと思っています。ここで

は私のコードです:

ALTER TRIGGER [Detail_Delete] 
    ON [Detail] 
    AFTER DELETE 
AS 
BEGIN 
SET NOCOUNT ON; 

DECLARE @Table UpdateTableType 

-- Here is where the problem lies. 
-- No records are found here because the Header record isn't found. 
INSERT @Table 
(HeaderID, UserID) 
SELECT d.HeaderID, h.UserID 
FROM deleted d 
JOIN Header h ON h.HeaderID = d.HeaderID 

EXECUTE sp_UpdateSummary 
    @Table = @Table 
END 
+0

私はSQL Server 2008 R2を使用していることを忘れていました –

答えて

3

削除私はカスケードを使用することはありませんので、あなたが見てきたように、削除された親データは利用できません

ストアドプロシージャは、このために理想的です。何らかの理由でない場合は、詳細や他の削除(そしてもちろんのヘッダテーブル)を行うためにヘッダーテーブルにトリガする前に、使用することができます

ALTER TRIGGER [Header_Delete] 
    ON [Header] 
    INSTEAD OF DELETE 
AS 
BEGIN 
SET NOCOUNT ON; 

DECLARE @Table UpdateTableType 

-- DELETED has data, even though Header has not yet been touched 
INSERT @Table 
(HeaderID, UserID) 
SELECT d.HeaderID, d.UserID 
FROM deleted 

DELETE Detail WHERE ... (using @Table) 

DELETE Other WHERE ... (using @Table) 

DELETE Header WHERE ... (using @Table) 

EXECUTE sp_UpdateSummary 
    @Table = @Table ... 
END 
+0

私はそれが私がやっていなければならないと思いました。 –

0

Headerレコードが最初に削除された場合は、アクセスできませんDetail - レコードが既に削除されているため、Headerレコードのトリガーが実行されたとき

関連する問題