SQL Server レプリケーションにおける重大な変更
このトピックでは、SQL Server のレプリケーションにおける重大な変更について説明します。これらの変更によって、以前のバージョンの SQL Server に基づくアプリケーション、スクリプト、または機能が使用できなくなる場合があります。この問題は、アップグレードするときに発生することがあります。詳細については、「アップグレード アドバイザを使用したアップグレードの準備」を参照してください。
SQL Server 2005 および SQL Server 2008 における重大な変更
ここでは、SQL Server 2005 または SQL Server 2008 のレプリケーション機能に関する重大な変更について説明します。
あらゆる種類のレプリケーションに影響する重大な変更
以下の重大な変更は、あらゆる種類のレプリケーションに適用されます。
変更点 |
説明 |
---|---|
レプリケーション スクリプトに関する変更 |
レプリケーション エージェントのセキュリティ モデルが SQL Server 2000 から変更されました。セキュリティ モデルの詳細については、「レプリケーション エージェントのセキュリティ モデル」を参照してください。SQL Server 2005 の sysadmin 固定サーバー ロールに属しているユーザーが、SQL Server 2000 または SQL Server 7.0 で作成されたレプリケーション スクリプトを実行する場合、そのスクリプトは正常に実行されます。dbo 固定データベース ロールまたはその他のロールのメンバの場合は、スクリプトを正常に実行できません。アップグレードが必要です。スクリプトのアップグレードについては、「レプリケーション スクリプトをアップグレードする方法 (レプリケーション Transact-SQL プログラミング)」を参照してください。sysadmin ロールのメンバが実行するスクリプトについては、アップグレードは必須ではありませんが、セキュリティ強化のメリットを活かすため、アップグレードすることをお勧めします。 |
レプリケーション エージェントのローカル接続 |
SQL Server 2005 へのアップグレード時には、SQL Server 認証を使用するすべてのローカル接続が Windows 認証を使用するよう修正されます。ローカル接続は、エージェントと同じコンピュータ上で実行されている SQL Server のインスタンスへの接続であり、エージェントによって行われます。たとえば、マージ エージェントは、プル サブスクリプションの場合はサブスクライバで動作します。したがって、マージ エージェントがサブスクライバに対して行う接続はローカル接続です。 以前のバージョンの SQL Server では、既定により、SQL Server エージェント サービス アカウントのコンテキストでエージェントが実行されていました。アップグレード後は、このアカウントのコンテキストでローカル接続が作成されます。SQL Server 2005 では、レプリケーション エージェントがデータベースなど他のリソースへの Windows 統合接続を実行および作成する各アカウントに対して、細かい単位の制御が可能であり、エージェントごとに異なるアカウントを指定できます。アップグレード後は、エージェントごとに異なるアカウントを指定することをお勧めします。詳細については、「レプリケートされたデータベースのアップグレードに関する注意点」および「レプリケーション エージェントのセキュリティ モデル」を参照してください。 |
ActiveX コントロール |
すべての ActiveX コントロールに、スクリプトおよび初期化に対して安全でないことを示すマークが付けられます。 スナップショット エージェント ActiveX コントロールは、SQL Server 2005 では使用できません。代わりに、新しいマネージ スナップショット エージェントを使用してください。詳細については、「SnapshotGenerationAgent」および「初期スナップショットを作成する方法 (RMO プログラミング)」を参照してください。 |
distributor_admin アカウントのパスワード |
パスワードの入力が必須でなかったため、パブリッシャとリモート ディストリビュータ間の信頼関係接続はサポート対象外となりました (SQL Server 2000 Service Pack 3 より前のバージョンでは、信頼関係接続が既定で使用されていました)。リモート ディストリビュータを使用する場合は、SQL Server 2005 にアップグレードする前に、信頼関係接続を非信頼関係接続に変換してください (この問題は、ローカル ディストリビュータを使用するパブリッシャには影響しません)。distributor_admin アカウントの詳細については、「ディストリビュータの保護」を参照してください。 使用する接続の種類を調べるには
非信頼関係接続に変更するには
|
SQL Server エージェントが含まれていない SQL Server Express |
SQL Server Express には SQL Server エージェントが含まれていないため、SQL Server Express にアップグレードする場合は、レプリケーションの同期を再構成する必要があります。 プル サブスクリプションを使用する場合は、レプリケーション管理オブジェクト (RMO) や Windows 同期マネージャを使用するか、またはコマンド ラインでエージェントを実行して、プル サブスクリプションを同期する必要があります。詳細については、「SQL Server Express へのデータのレプリケート」を参照してください。 引き続き、レプリケーション エージェント ジョブの実行に SQL Server エージェントを使用するには、プッシュ サブスクリプションを使用するか、別のバージョンの SQL Server にアップグレードする必要があります (SQL Server Express と SQL Server Compact 3.5 SP1 を除くすべてのバージョンに SQL Server エージェントが含まれています)。プッシュ サブスクリプションでは、ディストリビューション エージェントまたはマージ エージェントがディストリビュータで実行されるため、SQL Server エージェントを使用できます (SQL Server Express をディストリビュータにすることはできません)。 |
Microsoft Access (Jet 4.0) サブスクライバ |
Jet は Access で使用する基本データベースです。SQL Server 2000 のレプリケーションでは Jet データベースへのサブスクリプションをサポートしていましたが、これらのサブスクリプションはサポートされなくなりました。 代わりに、SQL Server Express を使用することをお勧めします。Access では SQL Server データベースをバックエンドとして使用できます。また、SQL Server データベースはこの問題による影響を受けません。詳細については、「SQL Server Express へのデータのレプリケート」を参照してください。 |
トランザクション レプリケーションに関する重大な変更
トランザクション レプリケーションにかかわる重大な変更は次のとおりです。
機能 |
説明 |
---|---|
バックアップからのトランザクション サブスクリプションの初期化1 |
SQL Server 2008 でサブスクリプションをバックアップから初期化するには、ユーザーは dbcreator サーバー ロールのメンバである必要があります。SQL Server 2005 では、db_owner データベース ロールのメンバシップで十分でした。 バックアップからサブスクリプションを初期化する方法の詳細については、「スナップショットを使用しないトランザクション サブスクリプションの初期化」を参照してください。 |
キュー更新サブスクリプションのメッセージ キュー (MSMQ) オプション |
キュー更新サブスクリプションでは、サブスクライバからの変更内容がキューに書き込まれた後、キュー リーダー エージェントによってそのキューから変更内容が読み取られ、パブリッシャへ配信されます。SQL Server 2000 では、サブスクリプションは SQL Server キューまたはメッセージ キューを使用して変更をキューに入れることができました。キューのタイプは sp_addpublication の @queue_type パラメータで指定され、sql と msmq (メッセージ キュー) の値を使用できましたが、SQL Server 2005 では sql の値しか使用できなくなりました。メッセージ キューを使用する既存のパブリケーションは、アップグレード時に、SQL Server キューを使用するよう修正されます。使用するアプリケーションがメッセージ キューによるキュー更新を必要とする場合は、SQL Server キューに対応するようにこれらのアプリケーションを記述し直す必要があります。キュー更新サブスクリプションの詳細については、「トランザクション レプリケーションの更新可能なサブスクリプション」を参照してください。 SQL Server のアップグレード中にメッセージ キュー サービスを実行していると、既存のメッセージ キュー サブスクリプション キューは削除されます。
重要
Windows 2000 と Windows XP のプラットフォームでは、メッセージ キューによって Microsoft 分散トランザクション コーディネータ (MSDTC) が使用されるので、MSDTC サービスも実行している必要があります。
メッセージ キュー サービスを実行していない場合は、アップグレード完了後にキューを手動で削除してください。キューの削除の詳細については、Windows のマニュアルを参照してください。 |
更新サブスクリプションの呼び出し形式に変更します。 |
既定では、一連のストアド プロシージャを使用して、トランザクション レプリケーションのサブスクライバに変更を適用します。各プロシージャには呼び出し形式があります。呼び出し形式によって、パラメータをプロシージャに渡す方法とサブスクライバに送信されるデータの量が決定されます。SQL Server 2000 では既定の形式は CALL です。SQL Server 2005 および SQL Server 2008 では既定の形式は VCALL です。 この変更が影響するのは、ストアド プロシージャがカスタマイズされているトポロジのみです。アップグレード後に、カスタマイズされたプロシージャの署名を追加パラメータを含むように変更する必要があります。変更しない場合、ディストリビューション エージェントは失敗します。 |
1 この問題は、SQL Server 2008 以降のバージョンのみに影響します。
マージ レプリケーションに関する重大な変更
マージ レプリケーションにかかわる重大な変更は次のとおりです。
機能 |
説明 |
---|---|
SQL Server Express からのパブリッシュ |
SQL Server MSDE はマージ パブリケーションのパブリッシャとして機能できましたが、MSDE に代わる SQL Server Express は、パブリッシャとしては使用できません。SQL Server Express では、マージ パブリケーション、トランザクション パブリケーション、およびスナップショット パブリケーションへのサブスクライブが可能です。更新サブスクリプションを使用するマージ レプリケーションとトランザクション レプリケーションはどちらも、サブスクライバからパブリッシャに変更内容を伝達できます。SQL Server Express へのレプリケートの詳細については、「SQL Server Express へのデータのレプリケート」を参照してください。 |
変更のバッチ化 |
以前のバージョンの SQL Server では、マージ エージェントによる変更が 1 行単位で実行されていました。SQL Server 2005 では、パフォーマンス向上のために変更がバッチ処理されるため、1 つのステートメント内で複数の行を挿入、更新、または削除できます。パブリケーション データベースまたはサブスクリプション データベースでパブリッシュされたテーブルにトリガがある場合には、トリガによって複数行の挿入、更新、および削除が処理されることを確認してください。詳細については、「DML トリガの複数行に関する注意点」を参照してください。 |
競合テーブルの再作成 |
SQL Server 2005 へのアップグレード時には、競合テーブルが、それらの所有者となる DBO で再作成されます。SQL Server 2000 で、これらのテーブルのいずれかを別のユーザーが所有していた場合は、アプリケーションの修正が必要な場合があります。 マージ レプリケーションでは、パブリケーション内のアーティクルごとに競合テーブルが作成され、conflict_PublicationName_ArticleName という形式の名前が付けられます。メタデータ テーブルはすべてアップグレード時に再作成され、競合テーブルはすべて DBO スキーマに作成されます。 |
新しい ID 範囲の割り当て |
ID 範囲の自動管理を使用するテーブルに対しては、アップグレード時にレプリケーションによって新しい ID 範囲が割り当てられる場合があります。パブリッシャよりもサブスクライバに大きな ID 範囲を割り当てるテーブルがある場合は、レプリケーションによって、サブスクライバと同等の範囲がパブリッシャに割り当てられます。 アーティクルごとに使用する範囲を判断するには、パブリケーション データベースで sp_helpmergearticle を実行して、pub_identity_range 列と identity_range 列をチェックします。 |