【问题标题】:Replace Create Trigger with Foreign Key (RI)用外键 (RI) 替换创建触发器
【发布时间】:2012-01-16 09:28:26
【问题描述】:

创建触发器:

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 条件,如何在具有 On del/update Cascade 的 FK 中表达它?

【问题讨论】:

  • 我想摆脱那个触发器并用 FK 约束替换它。当 PK ID 更改级联时,另一个 FK ID 表上的更改。

标签: sql sql-server triggers foreign-keys


【解决方案1】:

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

另外,正如@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 存在即可。

【讨论】:

    【解决方案2】:

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

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

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

    ON UPDATE CASCADE 正是这样做的——如果引用的列(ParentTable 中的 PKColumn)发生变化,那么 FK 约束将“级联”更新到子表并更新它的 ChildTableColumn 以匹配新的PKColumn

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

    【讨论】:

      猜你喜欢
      • 2016-06-25
      • 2017-03-31
      • 1970-01-01
      • 2012-01-18
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      • 2017-06-26
      • 1970-01-01
      相关资源
      最近更新 更多