用外键替换创建触发器(RI)

时间:2012-01-16 09:28:27

标签: sql sql-server triggers foreign-keys

创建触发器:

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表达?

2 个答案:

答案 0 :(得分:1)

FOREIGN KEY CONSTRAINTS 不会更新任何内容。它们检查写入记录的值,如果它们导致约束失败,则导致写入失败。

另外,正如@marc_s在他的评论中指出的那样,MS SQL Server中的触发器是基于设置的。 INSERTEDDELETED表可以同时保存多个记录。您的代码仅适用于一条记录。

你可以沿着这些方向尝试......

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


修改

我刚看了你的评论,我想我明白了。您需要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存在。

答案 1 :(得分:0)

我无法告诉你你在寻找什么 - 你的问题太不清楚了。

但基本上,如果两个表通过外键约束链接,当然你可以添加一个子句,以确保在父表的PK更改时子表更新:

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

ON UPDATE CASCADE完全相同 - 如果引用的列(PKColumn中的ParentTable)发生更改,则FK约束会将更新“级联”到子表中并更新它是ChildTableColumn以匹配新的PKColumn

阅读all about cascading referential integrity constraints以及您在MSDN联机丛书上有哪些选项