SQL リファレンス

SQL Server を中心に、SQL に関するテクニックを紹介します

SQL リファレンス

SQL Server を中心に、SQL に関するテクニックを紹介します

レプリケーション設定時、さまざまなエラーの対処に戸惑うことが多々あるかと思います。レプリケーションについてはインターネット上にもなかなか情報が載っておらず、そこでレプリケーション導入当初に発生しやすいエラーとその対処方法を紹介します。

「プロセスで、Subscriber に接続できませんでした。」のエラーが出る場合

 パブリッシャーのSQL Server Management Studioの「オブジェクト エクスプローラー」にて、サブスクリプションの「同期の状態の表示」を選択したとき、上記エラーメッセージが表示された場合。
サブスクリプションへの接続情報が間違っている可能性があります。
「オブジェクト エクスプローラー」より、当該サブスクリプションの「プロパティ」を選択。「サブスクリプションのプロパティ」画面が表示されるので、「5. セキュリティ」の「サブスクライバ接続」にて、当該サブスクライバのデータベースに接続するための接続情報を確認する。

お互いのデータベースには接続できるがレプリケーションから接続ができない

 以下のエラーメッセージが出てレプリケーションからデータベースに接続できない場合。

SQL Serverで、サーバー「○○○」に接続できません。

追加情報
SQL Serverレプリケーションでは、サーバーに接続するための実際のサーバー名が必要です。

 原因は、SQL Serverのインストール後にコンピューター名を変更したことです。SQL Serverに登録されたサーバー名と実際のコンピューター名に不一致が発生したことによります。
SQL Serverに登録されているサーバー名を確認するには、以下のコマンドを実行します。

SELECT @@servername;

SQL Serverに登録されているサーバー名を変更するには、以下のコマンドを実行します。

sp_dropserver [以前のコンピューター名]
GO
sp_addserver [新しいコンピューター名], ‘local’
GO

上記コマンドを実行後、SQL Serverのサービスを再起動することで@@servernameの値は新しく設定したコンピューター名に変更されます。

「Agent Xpsが無効」となってしまう

 レプリケーションの設定時に「Agent Xpsが無効」となってしまう場合、SQL Serverエージェントが起動されていません。SQL Serverエージェントのサービスを起動する必要があります。

トリガーのマージ レプリケーションについて

 マージ レプリケーション環境でトリガーを実行すると、思わぬ不具合が発生する場合があります。
例えば、社員マスタを更新すると社員変更履歴ログテーブルに変更内容を記録するトリガーが組み込まれていたとします。パブリケーション側で社員マスタを更新すると、その変更内容が社員変更履歴ログテーブルにも書き込まれるのはよいのですが、サブスクリプション側に変更内容が同期される際、社員マスタと社員変更履歴ログテーブルに変更分が同期した後、さらにサブスクリプション側でも社員マスタのトリガーが発動し、社員変更履歴ログテーブルに重複したデータが書き込まれてしまうという不具合です。
 このような不具合が発生しないようにするため、トリガー側にレプリケーション時は発動しないようにオプションを指定する必要があります。
これから新しいトリガーを作成する際は、CREATE TRIGGERコマンドにてNOT FOR REPLICATIONオプションを指定します。既存のトリガーには、ALTER TRIGGERコマンドにて、NOT FOR REPLICATIONオプションを指定します。

[CREATE もしくは ALTER] TRIGGER [トリガー名]
ON [テーブル名]
NOT FOR REPLICATION
AS
[SQLステートメント]

競合が発生した場合の対処について

 マージ レプリケーションの同期によって発生した競合を確認するためには、SQL Server Management Studioの「オブジェクト ブラウザ」より該当レプリケーションを右クリックし、「競合の表示」を選択します。
これをクリックすると、競合が発生したテーブルの一覧およびテーブルごとの競合件数が表示されます。
さらに、一覧に表示されているテーブル名をダブルクリックすると、そのテーブル内でどのデータが競合エラーを発生させているのかを確認することができます。
この画面にて、エラーの詳細も確認することができます。

‘[パブリケーション側のデータベース名]’ で行が挿入されましたが、'[サブスクリプション側のデータベース名]’ に反映できませんでした。このエラーは、制約違反によって発生します。制約 ‘PK_XXXXX’ の PRIMARY KEY 違反。オブジェクト ‘dbo.XXXXX’ には重複したキーを挿入できません。

これらの情報は、システムストアドプロシージャでも取得することができます。

sp_helpmergepublication …競合データがあるかどうかを確認する
sp_helpmergearticleconflicts …競合データが存在するテーブルを確認する
sp_helpmergeconflictrows …競合データが存在するテーブルの行を確認する

レプリケーションの設定時に表示されるエラーについて、よくあるのがデータベース接続情報の間違い。もう1度、サブスクライバーに接続する際のデータベース接続情報の設定を確認する。

コンピューター名を変更すると、レプリケーションがエラーを発するようになる。SQL Serverが保持しているコンピューター名が、変更前のコンピューター名になっているのが原因

トリガーが組み込まれているテーブルをマージ レプリケーションの同期対象とする際は要注意。トリガーによって別テーブルへのデータ追加等の操作が行われる場合、同期先で当該データ操作が重複したような結果が表れる。

マージ レプリケーションによる競合は、SQL Server Management Studioより、該当するテーブルやレコード件数などの詳細まで確認できる。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です