レプリケーションの制限事項
Microsoft SQL Server Compact 3.5 (SQL Server Compact 3.5) サブスクライバでマージ レプリケーションを使用する場合、パブリケーションに関する複数の制限事項があります。このセクションでは、これらの制限について説明します。
サブスクライバでのスキーマの変更に関する制限
サブスクライバでは一部のスキーマの変更を実行できますが、すべてではありません。次の表に、サブスクライバで実行できるスキーマの変更と、実行できないスキーマの変更を示します。
操作 | レプリケートされたテーブルでの実行 |
---|---|
テーブルの削除 |
× |
テーブル名の変更 |
× |
列の追加、削除、または移動 |
× |
ID 列のシード値または増分値の変更 |
○ |
既定値の追加または削除 |
○ |
主キーの追加または削除 |
× |
外部キーの追加または削除 |
× |
インデックスの追加または削除
注意 :
ユーザー テーブルのレプリケーション列のインデックスは、追加および削除しないことをお勧めします。レプリケーション列はシステム列として扱われるので、同期エラーが発生する原因になります。
|
○ |
インデックス名の変更 |
○ |
重要 : |
---|
システム テーブルではスキーマを変更できません。 |
追加要件
SQL Server Compact 3.5 サブスクライバには、次のルールが適用されます。
メモリ消費
再初期化が要求された後で、同期中に SQL Server Compact 3.5 データベースが一時的に実際のデータベースの 2 倍のサイズに拡張される場合がありますが、同期が完了すると (自動圧縮ポリシーに基づいて) 圧縮されます。サブスクリプション フィルタの検証
フィルタ検証により、データを同期させる前に、パブリッシャがサブスクライバのフィルタ値を確認できるようになります。サブスクライバのフィルタ値が変更されている場合、パブリッシャはサブスクライバでの再初期化を要求します。SQL Server 2008 でデータを同期させる際に、SQL Server Compact 3.5 ではフィルタ検証を使用できます。注意
HostName プロパティでは、サブスクリプションの動的フィルタ値を指定します。新しい HostName プロパティを指定することでサブスクライバの動的フィルタ値を変更する場合、同期する前に Reinitialize メソッドを呼び出す必要があります。
大文字と小文字の区別
SQL Server Compact 3.5 Service Pack 1 リリース以降の SQL Server Compact では、大文字と小文字を区別する照合順序の設定がデータベース レベルでサポートされるようになりました。ただし、テーブル名などのオブジェクト名、言語キーワード、関数、およびビューは、照合順序では大文字と小文字が区別されても、SQL Server Compact データベースでは大文字と小文字が区別されません。
つまり、SQL Server Compact データベースでは、オブジェクトの取り扱いが SQL Server データベースの場合と異なります。たとえば、SQL Server データベースでは大文字と小文字が区別されるので、MYTABLE というテーブルと mytable というテーブルが、異なるオブジェクトとして扱われます。SQL Server Compact データベース内に同じテーブル名があると、名前付けの競合が生じます。一方、MYVALUE という値と myvalue という値は異なる値として扱われるため、SQL Server Compact で主キー違反にはならなくなりました。大文字と小文字が区別されるため違反にはならない SQL Server データベースの場合と同様です。テーブル内の列数
SQL Server Compact 3.5 では、7 個のシステム列が監視用に割り当てられます。ただし、これらのシステム テーブルは列数の制限を計算する際に無視されます。NOT FOR REPLICATION 制約
SQL Server Compact 3.5 では、NOT FOR REPLICATION オプションがサポートされていません。このオプションを使用した制約は作成しないでください。データベース内の制約に NOT FOR REPLICATION オプションがある場合は、その制約をいったん削除してから、再作成します。SQL Server Compact 3.5 サブスクライバでは、NOT FOR REPLICATION オプションを指定した場合も制約は作成されますが、NOT FOR REPLICATION 構文は含められません。接続タイムアウト
SQL Server Compact 3.5 サブスクリプションでは、通信障害が発生した場合、(ユーザーが構成する) タイムアウトの期限内に接続が復元されると、最後に正常に転送されたデータ ブロックから再開することで通信障害から復旧します。これにより、基になっている転送接続の信頼性が低い場合や転送接続が一時的に使用できない場合も、同期が可能になります。スナップショット
SQL Server Compact 3.5 では、スナップショットの場所オプションに、既定および代替の場所を指定できます。スナップショットの代替場所を指定するには、sp_addmergepublication ストアド プロシージャを使用するか、SQL Server Management Studio を使用して既存パブリケーションのプロパティを変更することによって、このオプションを設定します。- sp_addmergepublication ストアド プロシージャを使用するには
@snapshot_in_defaultfolder オプションを FALSE に設定し、@alt_snapshot_folder= <スナップショットの代替フォルダの場所> に設定します。 - 既存パブリケーションの [パブリケーションのプロパティ] の設定を変更するには
[パブリケーションのプロパティ] ダイアログ ボックスの [スナップショット] セクションで、[ファイルを既定のフォルダに保存する] チェック ボックスをオフにします。次に、[ファイルを次のフォルダに保存する] チェック ボックスをオンにして、新しい場所を指定します。
注意
SQL Server Compact 3.5 では、圧縮スナップショット オプションがサポートされていません。
- sp_addmergepublication ストアド プロシージャを使用するには
スナップショットの詳細については、「スナップショット フォルダの構成」を参照してください。
SQL Server Compact 3.5 サブスクライバに反映されない情報
以下の項目は、SQL Server パブリケーションに含めることができますが、SQL Server Compact 3.5 サブスクライバには反映されません。
- CHECK 制約
- 拡張プロパティ
- ストアド プロシージャ
- ビュー
- ユーザー定義関数
- トリガ
SQL Server Compact 3.5 レプリケーションではこれらの項目を反映できないので、SQL Server Compact 3.5 ベースのアプリケーションに同等のロジックを実装する必要があります。これにより、SQL Server Compact 3.5 データベースと SQL Server データベースの間で一貫性を保つことができます。たとえば、SQL Server データベースに CHECK 制約が含まれる場合は、SQL Server Compact 3.5 ベースのアプリケーションで、対応するチェックをアプリケーション コードに実装する必要があります。
ローカルの SQL Server Compact 3.5 データベースでのインデックスの作成
ローカルの SQL Server Compact 3.5 データベースがパブリケーションに対するサブスクライバである場合も、このデータベースに一意なインデックスを作成できます。この機能は便利ですが、列に一意制約を持たないパブリッシャからサブスクライバに一意でないデータが送信される場合、この機能が原因で問題が発生することがあります。たとえば、C1 列と C2 列を含む T テーブルがあり、C1 に主キーが存在するとします。
C1 |
C2 |
A |
1 |
B |
2 |
C |
3 |
初期同期は、SQL Server Compact 3.5 データベースで行われます。この同期の後、サブスクリプション データベースの C2 に一意なインデックスが追加されます。パブリケーション データベースは変更されません。
次の同期中に、SQL Server により以下の行が挿入されます。
D |
3 |
E |
3 |
この場合、パブリッシャが C2 に一意でない値を挿入するので、同期が失敗します。サブスクリプション データベースから一意制約が削除されない限り、同期は失敗し続けます。