SQLServer2005 レプリケーションテーブルのスキーマ変更

レプリケーションしているテーブルに列を追加することになった。

SQLServer2000ではEnterPriseManagerでバブリーケーションのプロパティを開くと、[フィルタ列]というタブがあり、そこに[列をテーブルに追加]というボタンがあった。
このボタンをクリックして表示されるダイアログで追加することができた。

SQLServer 2005のManagement Studioではバブリーケーションのプロパティ設定ダイアログにはそういう機能は無い。
グーグルで検索してみると、MSのTechnetに「パブリケーション データベースでのスキーマの変更」というページがあったので読んでみた。
テーブルに対するスキーマ変更は、Transact-SQL または SQL Server 管理オブジェクト (SMO) を使用して行う必要があります。
SQL Server Management Studio でスキーマ変更を行うと、Management Studio は、テーブルを削除して再作成しようとします。
パブリッシュされたオブジェクトは削除できないため、スキーマ変更は失敗します。
などと書いてある。

要するに、
「Management StudioではできないのでTransact-SQLを使え」
「ALTER TABLEでパブリッシャのテーブルを変更すれば、レプリケーションマージでサブスクライバ側に反映される」
ということらしい。

他にも「注意点」がたくさん書いてあったが、ものは試しなのでとりあえず実行してみることにした。


まず、パブリッシャにALTER TABLE コマンドで列を追加。
USE [PUBDB]
ALTER TABLE dbo.TSTMST ADD TCOL2 [char](4) NULL DEFAULT ('')
ALTER TABLE dbo.TSTMST ADD TCOL1 [char](3) NULL DEFAULT ('')

その後、レプリケーションスナップショットとレプリケーションマージを順番に実行すると、サブスクライバのテーブルにも列が追加された。



列を削除することないだろうが、ついでなので列の削除も試してみる。

上の例では既定値を指定していたので、自動的に作成される[制約(CONSTRAINT)]も削除しておく必要があるらしい。
USE [PUBDB]
ALTER TABLE dbo.TSTMST DROP CONSTRAINT [DF__TSTMST__TCOL1__4A306D10]
ALTER TABLE dbo.TSTMST DROP CONSTRAINT [DF__TSTMST__TCOL2__36297463]
ALTER TABLE dbo.TSTMST DROP COLUMN TCOL1
ALTER TABLE dbo.TSTMST DROP COLUMN TCOL2

これで、パブリッシャ側の列は削除されたので、レプリケーションマージを行ったが、エラーになってしまった。

削除しようとした列は当然ながら主キーではないし、インデックスも作成していない。


前出のページの「注意点」を読むと、
制約には明示的に名前を付けることをお勧めします。明示的に制約に名前を付けない場合、SQL Server が制約の名前を生成するので、これらの名前がパブリッシャと各サブスクライバで異なります。このことが原因で、スキーマ変更のレプリケーション中に問題が発生することがあります。たとえば、パブリッシャ側で列を削除することにより依存制約が削除されると、レプリケーションは、サブスクライバ側でこの制約を削除しようとします。制約の名前が異なるので、サブスクライバでの削除は失敗します。制約の名前付けの問題によって同期に失敗する場合、サブスクライバ側で制約を手動で削除して、マージ エージェントを再実行してください。
というのがあった。

列を追加したときに指定していた DEFAULT('') で作成される[制約(CONSTRAINT)]名を指定していないため名前が自動で生成され、パブリッシャとサブスクライバで違う名前になっていた。
そのためマージのときにエラーになるようだ。

こういう場合は、サブスクライバ側の[制約]をALTER TABLEで削除してからレプリケーションマージをすればいいようだ。
USE [SUBDB]
ALTER TABLE dbo.TSTMST DROP CONSTRAINT [DF__TSTMST__TCOL1__0E04126B]
ALTER TABLE dbo.TSTMST DROP CONSTRAINT [DF__TSTMST__TCOL2__7DCDAAA2]

こうして[制約]を削除してから、レプリケーションマージをしたら無事にサブスクライバ側の列が削除された。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 1

なるほど(納得、参考になった、ヘー)

この記事へのコメント

この記事へのトラックバック