SQL 服务器 - 如何在仅更新(不删除)时绕过错误的多级联路径?
SQL Server - How to get round false Multiple Cascade paths on Update Only (Not Deletes)?
我有 2 个 table,一个用于用户,一个用于订单,布局如下:
**Users**
Username
**Orders**
MadeBy NOT NULL (on Delete - No Action on Update - Cascade)
ApprovedBy NULL (on Delete - Set NULL on Update - Cascade)
如您所见,这两个字段都与用户名 table 中的同一字段相关,但它们可能彼此不同,即用户 1 下订单,用户 2 批准。这两个子字段都不会 link 到数据库中的任何其他地方。
我收到以下错误:
'Users' table saved successfully
'Orders' table
- Unable to create relationship 'FK_Orders_ApprovedBy'.
Introducing FOREIGN KEY constraint 'FK_Orders_ApprovedBy' on table 'Orders' may cause cycles or multiple cascade paths.
Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint or index. See previous errors.
只有当我将两个外键中的第二个(在本例中为 ApprovedBy)更新规则设置为级联时,才会发生这种情况。删除规则没问题(大概是因为它们不同)。
我该如何解决这个问题?我读过有关使用触发器的信息,但我不确定 how/where 我应该将它们应用到什么地方,以及用于引用刚刚更改的先前值的语法是什么。
这是 SQL Management studio 用于应用最终更改的代码(将 FK_Orders_ApprovedBy 更新规则设置为级联):
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.Users SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.Orders ADD CONSTRAINT
FK_Orders_ApprovedBy FOREIGN KEY
(
ApprovedBy
) REFERENCES dbo.Users
(
UserName
) ON UPDATE CASCADE
ON DELETE SET NULL
GO
ALTER TABLE dbo.Orders SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
尝试将 ON DELETE
设置为 CASCADE
时,您会遇到同样的错误。因此,如果这是一个要求,那么除了 INSTEAD OF
触发器别无选择。 (或者用一些应用程序层、SP 或其他东西来做)。
下一次更新 PK 是相当罕见的情况。一般来说,在实体生命周期中可以更新的所有内容都不能干扰 PK。 PK应该发挥的唯一作用就是"there exists an entity"。请检查您的设计。
我有 2 个 table,一个用于用户,一个用于订单,布局如下:
**Users**
Username
**Orders**
MadeBy NOT NULL (on Delete - No Action on Update - Cascade)
ApprovedBy NULL (on Delete - Set NULL on Update - Cascade)
如您所见,这两个字段都与用户名 table 中的同一字段相关,但它们可能彼此不同,即用户 1 下订单,用户 2 批准。这两个子字段都不会 link 到数据库中的任何其他地方。
我收到以下错误:
'Users' table saved successfully
'Orders' table
- Unable to create relationship 'FK_Orders_ApprovedBy'.
Introducing FOREIGN KEY constraint 'FK_Orders_ApprovedBy' on table 'Orders' may cause cycles or multiple cascade paths.
Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint or index. See previous errors.
只有当我将两个外键中的第二个(在本例中为 ApprovedBy)更新规则设置为级联时,才会发生这种情况。删除规则没问题(大概是因为它们不同)。
我该如何解决这个问题?我读过有关使用触发器的信息,但我不确定 how/where 我应该将它们应用到什么地方,以及用于引用刚刚更改的先前值的语法是什么。
这是 SQL Management studio 用于应用最终更改的代码(将 FK_Orders_ApprovedBy 更新规则设置为级联):
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.Users SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.Orders ADD CONSTRAINT
FK_Orders_ApprovedBy FOREIGN KEY
(
ApprovedBy
) REFERENCES dbo.Users
(
UserName
) ON UPDATE CASCADE
ON DELETE SET NULL
GO
ALTER TABLE dbo.Orders SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
尝试将 ON DELETE
设置为 CASCADE
时,您会遇到同样的错误。因此,如果这是一个要求,那么除了 INSTEAD OF
触发器别无选择。 (或者用一些应用程序层、SP 或其他东西来做)。
下一次更新 PK 是相当罕见的情况。一般来说,在实体生命周期中可以更新的所有内容都不能干扰 PK。 PK应该发挥的唯一作用就是"there exists an entity"。请检查您的设计。