我有两张桌子。第一个表是数据库名称和备份文件的列表。第二个表是所述数据库的关系,包括主数据库,附件数据库,公共数据库和公式数据库,它们一起用作组。一些主数据库可能与工作组共享其他数据库(附件,公共和处方集)。
示例数据库'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中删除旧行表,这为错误创造了更多机会。
答案 0 :(得分:0)
问题源于T-SQL本身的限制。从这个Error message 1795“一个表在一个由DELETE或UPDATE语句启动的所有级联引用操作的列表中不能出现多次。
解决方案是在查找表上使用触发器来模拟剩余关系的更新级联。