7

マージ レプリケーションを使用して、Sql サーバー 2005 でデータベースを実行しています。常に値を持つ必要があるため、一部の FK 列を「非 null」に変更したいと考えています。ただし、SQLサーバーではそれができません。これは次のように述べています。

  • テーブルを変更できません。マージ レプリケーションで使用される rowguid 列の既定の制約を削除することは無効です。内部レプリケーション手順の実行中にスキーマの変更に失敗しました。修正処置については、このエラー メッセージに付随する他のエラー メッセージを参照してください。トランザクションはトリガーで終了しました。バッチは中止されました。

FKとして機能している別の列に対してのみ、rowguid列の制約をまったく変更しようとはしていません。null 以外に設定したいその他の列は、その情報 (つまり、顧客、顧客名) がなければレコードが意味をなさないためです。

質問: レプリケーションをオフにしてから再度オンにせずに、列を「非ヌル」に更新する方法はありますか? これはこれを行うための最良の方法でもありますか?代わりに制約を使用する必要がありますか?

4

2 に答える 2

9

どうやらSSMSはテーブルを削除して再作成することでテーブルに変更を加えます。そのため、T-SQL ステートメントを使用して変更を加える必要がありました。

ALTER TABLE dbo.MyTable ALTER COLUMN MyColumn nvarchar(50) NOT NULL 
于 2009-12-16T03:34:59.387 に答える
3

SQL Server Management Studio は単に追加の列を追加するのではなく、テーブルを削除して再作成しようとするため、T-SQL ステートメントで変更をスクリプト化する必要があります。

また、パブリケーションに新しい列を追加する必要があります。

この方法で列を変更すると、レプリケーションのパフォーマンスが低下する可能性があることに注意してください。変更するテーブルのサイズによっては、大量のデータが複製される可能性があります。テーブルの変更は 1 つのステートメントで実行できますが、100 万行が影響を受ける場合、サブスクライバーで 100 万の更新が生成され、一般に考えられている単一の更新ステートメントではありません。

ハンズオン、改善されたパフォーマンスアプローチ......

この演習を実行するには、次のことが必要です。

  1. 構成全体をスクリプト化して、レプリケーション環境をバックアップします。
  2. パブリッシャー/サブスクライバーの両方でレプリケーションからテーブルを削除します
  3. パブリッシャー/サブスクライバーごとに列を追加します。
  4. 各パブリッシャー/サブスクライバーでローカルに更新を適用します。
  5. テーブルをレプリケーションに追加し直します。
  6. トランザクションがレプリケートされていることを検証します。
于 2009-12-16T07:27:49.787 に答える