两个表,与“On Update Cascade”

时间:2017-02-07 20:32:37

标签: sql-server database foreign-keys

我有两张桌子。第一个表是数据库名称和备份文件的列表。第二个表是所述数据库的关系,包括主数据库,附件数据库,公共数据库和公式数据库,它们一起用作组。一些主数据库可能与工作组共享其他数据库(附件,公共和处方集)。

示例数据库'sales'和'marketing'是主数据库,它们共享附件,公共和处方数据库。另一个主要数据库“分发”与其他两个共享,但有自己的附件和处方集。还有其他主要数据库与支持数据库有自己的关系。

DatabaseRelationships中的每一列必须存在于数据库x ref表中。但SQL似乎阻止了这一点。我该如何实现这一目标?

CREATE TABLE [dbo].[DatabaseNameToFileNameXref](
    [DatabaseName] [nvarchar](128) NOT NULL,
    [FileName] [nvarchar](2048) NOT NULL,
 CONSTRAINT [PK_DatabaseNameToFileNameXref] PRIMARY KEY CLUSTERED 
(
    [DatabaseName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
       IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
       ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

CREATE TABLE [dbo].[DatabaseRelationships](
    [PrimaryDatabaseName] [nvarchar](128) NOT NULL,
    [AttachmentDatabaseName] [nvarchar](128) NOT NULL,
    [CommonDatabaseName] [nvarchar](128) NOT NULL,
    [FormularyDatabaseName] [nvarchar](128) NOT NULL,
 CONSTRAINT [DatabaseRelationships_PK] PRIMARY KEY CLUSTERED 
(
    [PrimaryDatabaseName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

有人提出这个问题与“多态协会”问题有关。但是,我不相信这种情况。每列都是DatabaseBase,返回xref表的链接不确定类型。数据库的类型由DatabaseRelationship表确定:Primary,Attachment等

实际的错误消息与FK的“On Update Cascade”有关,它们可能:'..可能导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION'我现在看到我只能将一个这样的FK返回到x-ref表;当我尝试使用相同的更新后设置创建第二个FK时,我收到错误。否则,如果没有更新,它就可以工作。

所以实际的问题是,如何添加级联功能?我可以使用其他机制吗?

使用这个简写,DatabaseRelationship作为DR,DatabaseNameToFileNameXref作为X,FK是从DR.PrimaryDatabase到X.DatabaseName,从DR.AttachmentDatabase到X.DatabaseName,从DR.CommonDatabaseName到X.DatabaseName,最后DR.FormularyDatabaseName到X.DatabaseName。 X表提供了用于还原数据库的文件名。 DR表描述了数据库如何相互关联。如果我更改数据库的名称,没有级联,我必须在X表中为新名称创建一个新条目,然后更新受影响的DR表中的每一行,然后从X中删除旧行表,这为错误创造了更多机会。

1 个答案:

答案 0 :(得分:0)

问题源于T-SQL本身的限制。从这个Error message 1795“一个表在一个由DELETE或UPDATE语句启动的所有级联引用操作的列表中不能出现多次。

解决方案是在查找表上使用触发器来模拟剩余关系的更新级联。