SQL Server関連テーブルのGUIDからBigIntにプライマリキーを変更するためのアプローチ
-
02-10-2019 - |
質問
GUIDプライマリキーと、外部キーを介して関連する12のテーブルを備えた1,000万列の列を備えた2つのテーブルがあります。ベーステーブルには、それぞれ10〜20のインデックスがあります。
GUIDからBigintプライマリキーに移行しています。誰かがアプローチについて何か提案をしているのだろうかと思っています。今、これは私が熟考しているアプローチです:
- 関係するすべてのテーブルにすべてのインデックスとFKEYがドロップします。
- 各テーブルに「NewPrimaryKey」列を追加します
- 2つのベーステーブルで重要なアイデンティティを作成します
- スクリプトデータ変更 "テーブルxを更新、newprimarykey = yを設定するoldprimarykey = z
- オリジナルのプライマリキーを「oldprimarykey」に変更します
- 「NewPrimaryKey」列「PrimaryKey」の名前を変更します
- すべてのインデックスとfkeysをスクリプト化します
これは良いアプローチのように思えますか?誰かがこれに役立つツールやスクリプトを知っていますか?
TD:追加情報ごとに編集。 GUIDがプライマリである場合にアプローチに対処するこのブログ投稿を参照してください。 http://www.sqlmag.com/blogs/sql-server-questions-answered/sql-server-questions-answered/tabid/1977/entryid/12749/default.aspx
解決
確かにこの戦略は機能するように聞こえます - 制約をドロップし、列を下から変更します(タイプの変更、名前は同じままです)、そして制約を再現することはかなりエレガントです。
最終的にGUID列をドロップするという目標はありますか?もしそうなら、テーブルがコピーまたは再構築されない限り、実際にスペースを取り戻すことはありません。
...
4.データの変更 "テーブルxを更新、newprimarykey = yを設定しますoldprimarykey = z
5.落とす 「OldPrimaryKey」へのオリジナルのプライマリーキー
6.「NewPrimaryKey」列「PrimaryKey」を飾る
7.すべてのインデックスとfkeysをバックバックします(クラスター化されたインデックスの構築「再構築」テーブル)
8.インデックスがクラスター化されていないすべてのテーブルの場合、それらが再構築され、そのスペースが再生されることを確認するために何かをしてください(そのようなビルド、次にクラスター化されたインデックスをドロップします)
言うまでもなく、制作中に実行する前に開発ボックスでテストしてください!
他のヒント
あなたのアプローチは私がそれをする方法です。
あなたは本当にbigintが必要ですか?通常の4バイトINTは20億(2,147,483,647)になります。
私も追加します:
開始する前に、適切な現在のバックアップがあることを確認してください。サーバーを変更してシングルユーザーモードで実行します(最初に停止期間をユーザーに通知します)。これが進行中にユーザーにデータを入力しようとしたくない。