2012-01-16 13 views
2

を作成し交換するトリガーを作成します。は、外部キーとトリガ(RI)

SELECT @oldVersionId = (SELECT DISTINCT VERSION_ID FROM Deleted) 
    SELECT @newVersionId = (SELECT DISTINCT VERSION_ID FROM Inserted) 
    SELECT @appId = (SELECT DISTINCT APP_ID FROM Deleted) 

UPDATE [TableName] 
SET [VERSION_ID] = @newVersionId 
WHERE (([VERSION_ID] = @oldVersionId) AND ([APP_ID] = @appId)) 

このトリガーはVERSION_IDを更新するために、外部キーと交換することができますか?

私が問題になる可能性があるのはAND条件ですか、どのようにFKでOn del/update Cascadeを使って表現するのですか?

+0

私はそのトリガーを取り除き、それをFK制約に置き換えたいと思っています。 PK IDが変更されると、別のFK IDテーブルで変更がカスケードされます。 – Elisabeth

答えて

0

私は本当にあなたが探しているものは教えてくれません。あなたの質問ではあまりにも明確ではありません。

しかし、2つのテーブルは、外部キー制約を介して連結されている場合は、基本的には、もちろんあなたは時に親テーブルのPKが変化し、子テーブルが更新されることを確認することに句を追加することができます。

ALTER TABLE dbo.ChildTable 
ADD CONSTRAINT FK_ChildTable_ParentTable 
FOREIGN KEY(ChildTableColumn) REFERENCES dbo.ParentTable(PKColumn) 
    ON UPDATE CASCADE 

ON UPDATE CASCADEはその正確ん - 参照列(ParentTablePKColumnが)変更は、その後、FK制約が「カスケード」ダウン子テーブルに、その更新が更新される場合、それは新しいPKColumn

読むall about cascading referential integrity constraintsとWHと一致するように、ChildTableColumnですMSDNオンラインブックのオプションで

1

外部キー制約は何も更新しません。レコードに書き込まれている値をチェックし、制約が失敗すると書き込みが失敗するようにします。

@marc_sが彼のコメントで指摘しているように、MS SQL Serverのトリガは、ベースに設定されています。 INSERTEDDELETEDテーブルは、複数のレコードを同時に保持できます。コードは1つのレコードに対してのみ機能します。あなたはこれらの線に沿って何かを試みることができる

...

UPDATE 
    table 
SET 
    VERSION_ID = inserted.VERSION_ID 
FROM 
    table 
INNER JOIN 
    deleted 
    ON table.VERSION_ID = deleted.VERSION_ID 
    AND table.APP_ID  = deleted.APP_ID 
INNER JOIN 
    inserted 
    ON deleted.PRIMARY_KEY = inserted.PRIMARY_KEY 


EDIT

私はちょうどあなたのコメントを読んで、私は理解してだと思います。 ON UPDATE CASCADEで外部キー制約が必要です。

DDLを使用してこの形式を使用します。

ALTER TABLE DBO.<child table> 
ADD CONSTRAINT <foreign key name> FOREIGN KEY <child column> 
REFERENCES DBO.<parent table>(<parent column>) 
{ON [DELETE|UPDATE] CASCADE} 

または、SQL Server Management Studioを設定するだけで済みます。 ON UPDATE CASCADEが存在することを確認してください。