2017-02-07 101 views
0

我有兩個表。第一個表是數據庫名稱和備份文件的列表。第二張表是所述數據庫的關係,它們是主要的,附件的,通用的和公式化的數據庫,它們一起用作組。一些主數據庫可能與工作組共享其他數據庫(附件,通用和規範)。兩張表,許多與「更新級聯」的外鍵關係

示例數據庫的「銷售」和「市場營銷」是主數據庫,它們共享附件,通用和規範數據庫。另一個主要數據庫「發行」與另外兩個主要數據庫有共同之處,但有其自己的附件和公式。還有其他主要數據庫與支持數據庫有自己的關係。

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,回到外部參照表的鏈接不確定類型。數據庫的類型由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表提供恢復數據庫的文件名。災難恢復表描述了數據庫是如何相互關聯的。如果我更改了數據庫的名稱,但是沒有級聯,我必須在X表中爲新名稱創建一個新條目,然後更新DR表中受影響的每一行,然後從X中刪除舊行表,這爲錯誤創造了更多的機會。

+0

爲什麼沒有標識列 – steamrolla

+0

@steamrolla只是折騰的身份,因爲每個表的主鍵並不總是一個好辦法 –

+1

問:?爲什麼沒有標識列 ?答:我一般不要'不喜歡標識列,另外'DatabaseName'和'PrimaryDatabaseName'是唯一的,並且可以很好地作爲各自表的主鍵。 –

回答

0

該問題源於T-SQL本身的限制。從這個Error message 1795「一個表不能出現超過一次的所有級聯參考動作的列表,由DELETE或UPDATE語句啓動。

解決方案是使用查找表上的觸發器來模擬對於其餘關係級聯更新