Sql server 两个表,许多外键关系与;“关于更新级联”;

Sql server 两个表,许多外键关系与;“关于更新级联”;,sql-server,database,foreign-keys,Sql Server,Database,Foreign Keys,我有两张桌子。第一个表是数据库名称和备份文件的列表。第二个表是所述数据库之间的关系,有主数据库、附件数据库、通用数据库和公式数据库,它们作为组一起使用。一些主要数据库可能与工作组共享其他数据库(附件、通用和公式集) 示例数据库“sales”和“marketing”是主要数据库,它们共享附件数据库、通用数据库和处方集数据库。另一个主要数据库“distribution”与其他两个数据库共享相同之处,但有自己的附件和公式集。还有其他主要数据库,它们与支持数据库有自己的关系 DatabaseRelati

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

示例数据库“sales”和“marketing”是主要数据库,它们共享附件数据库、通用数据库和处方集数据库。另一个主要数据库“distribution”与其他两个数据库共享相同之处,但有自己的附件和公式集。还有其他主要数据库,它们与支持数据库有自己的关系

DatabaseRelationships中的每一列都必须存在于database 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]
有人认为这个问题与“多态关联”问题有关。然而,我认为情况并非如此。每列都是一个数据库,返回到外部参照表的链接并不确定类型。数据库的类型由DatabaseRelationship表确定:主、附件等

实际错误消息与FK的“更新级联”相关,这可能导致循环或多个级联路径。在删除无操作或更新无操作时指定“我现在看到我只能将一个这样的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表中删除旧行,这会造成更多错误。

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


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

为什么没有标识列?@steamrolla仅仅将标识作为每个表的主键并不总是一个好方法。问:为什么没有标识列?答:我通常不喜欢标识列,也不喜欢“DatabaseName”和“Primar”yDatabaseName“是唯一的,并且可以作为各自表的主键使用。@SeanLange同意。但是,在这里,我们可以在使用较少数据的情况下获得类似的速度,并且,当有人希望更改一个表的名称时,不必处理关键问题(这可能会发生,因为managers=d)。我在这里看到的真正问题是,您正在描述一个多对多关系,但您的数据模型不支持。您需要第三个表。每个主数据库可以有一个或多个相关数据库,每个相关数据库可以属于一个或多个主数据库。这是一个经典的多对多关系,需要一个桥接表I在他们之间。