创建触发器:
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 :(得分:1)
FOREIGN KEY CONSTRAINTS 不会更新任何内容。它们检查写入记录的值,如果它们导致约束失败,则导致写入失败。
另外,正如@marc_s在他的评论中指出的那样,MS SQL Server中的触发器是基于设置的。 INSERTED
和DELETED
表可以同时保存多个记录。您的代码仅适用于一条记录。
你可以沿着这些方向尝试......
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联机丛书上有哪些选项