Sql-Server

如何強制訂閱者擁有外鍵 WITH CHECK?

  • April 22, 2020

我知道預設情況下 SQL Server 複製在事務複製之後添加WITH NOCHECKNOT FOR REPLICATION到外鍵。但是有沒有辦法,我可以避免複製所做的這些程式碼更改。我們使用比較工具,這些小的變化會被突出顯示。我知道為什麼要放置它們,但是已經提出了一些要求,我希望WITH CHECK在訂戶端也有約束。我只是想知道我們是否可以通過某種方式避免在發布者和訂閱者上對文章腳本進行這些少量添加和更改。

原始腳本如下所示:

ALTER TABLE [dbo].[Tablename] WITH CHECK ADD CONSTRAINT [FK__E__06] FOREIGN KEY ([eId]) REFERENCES [dbo].[table] ([Id]) 
GO
ALTER TABLE [dbo].[Tablename] WITH CHECK ADD CONSTRAINT [FK__E_S__05] FOREIGN KEY ([nId]) REFERENCES [dbo].[table] ([Id])
GO

訂戶處的更改腳本如下所示:

ALTER TABLE [dbo].[Tablename] WITH NOCHECK ADD CONSTRAINT [FK__E__06] FOREIGN KEY ([eId]) REFERENCES [dbo].[table] ([Id]) NOT FOR REPLICATION
GO
ALTER TABLE [dbo].[Tablename] WITH NOCHECK ADD CONSTRAINT [FK__E_S__05] FOREIGN KEY ([nId]) REFERENCES [dbo].[table] ([Id]) NOT FOR REPLICATION
GO

我想避免這些更改,並且在文章屬性窗格中,我選擇了 True 以便在訂閱者處複製約束

我知道預設情況下 SQL Server 複製添加 WITH NOCHECK 和 NOT FOR REPLICATION

不完全的。預設情況下,它們是 CHECK 或 NOCKECK 以匹配發布者的約束,但設置為 NOT FOR REPLICATION,因此來自分發代理的更新不會觸發約束。

你可以選擇

  1. 是否首先在文章屬性中複製約束,通過在sp_addarticle中的 schema_option 位遮罩中設置或 0x200 標誌(第 2 字節,第 2 位)

0x200 複製外鍵約束。如果引用的表不是發布的一部分,則不會複製已發布表上的所有外鍵約束

  1. 它們是否在訂閱者處使用 NOT FOR REPLICATION 選項創建,通過設置或清除 0x20000 標誌(第 3 字節,第 2 位)

0x20000 將 FOREIGN KEY 約束複製為 NOT FOR REPLICATION,以便在同步期間不強制執行約束。

預設情況下,此半字節為 3,因為還設置了控制檢查約束的 0x10000 標誌。因此,將此半字節設置為 0x10000 以創建不帶 NOT FOR REPLICATION 選項的 FK 約束,設置為 0x00000 以創建不帶 NOT FOR REPLICATION 選項的 FK 約束和檢查約束。

一般參見同步中觸發器和約束的控制行為

引用自:https://dba.stackexchange.com/questions/265538