web-dev-qa-db-ja.com

サブスクライバーに外部キーWITH CHECKを強制する方法は?

SQL Serverのレプリケーションでは、トランザクションレプリケーションの後に外部キーにWITH NOCHECKNOT FOR REPLICATIONがデフォルトで追加されることを知っています。しかし、レプリケーションによって行われるこれらのコード変更を回避できる方法があります。比較ツールを使用すると、これらの小さな変更が強調表示されます。私はそれらが配置されている理由を理解していますが、サブスクライバー側にもWITH CHECKs制約を課したいといういくつかの要件が出てきました。パブリッシャーとサブスクライバーの両方で、記事スクリプトへのこれらのいくつかの追加と変更を何らかの方法で回避できるかどうか知りたいだけです。

元のスクリプトは次のようになります。

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を選択しました

3
tsu90280

SQL Serverのレプリケーションでは、WITH NOCHECKおよびNOT FOR REPLICATIONがデフォルトで追加されることを知っています

結構です。デフォルトでは、パブリッシャーの制約に一致するようにCHECKまたはNOCKECKですが、NOT FOR REPLICATIONに設定されているため、ディストリビューションエージェントからの更新によって制約が発生することはありません。

選んでいいですよ

1) sp_addarticle のschema_optionビットマスクで0x200フラグ(2番目のバイト、2番目のビット)を設定または設定することにより、記事のプロパティの最初の場所に制約がコピーされるかどうか

0x200外部キー制約を複製します。参照されるテーブルがパブリケーションの一部でない場合、パブリッシュされたテーブルのすべての外部キー制約は複製されません

2)0x20000フラグ(3バイト目、2ビット目)を設定またはクリアすることにより、サブスクライバーでNOT FOR REPLICATIONオプションを使用して作成されているかどうか

0x20000は、FOREIGN KEY制約をNOT FOR REPLICATIONとして複製し、同期中に制約が適用されないようにします。

チェック制約を制御する0x10000フラグも設定されているため、デフォルトではこのニブルは3です。したがって、このニブルを0x10000に設定してNOT FOR REPLICATIONオプションなしでFK制約を作成し、0x00000に設定してNOT FOR REPLICATIONオプションなしでFK制約とチェック制約の両方を作成します。

一般的に参照 同期におけるトリガーと制約の制御動作