0

私は、データベースを再作成するためのスクリプトを生成する際に 'Identity'列をどのように扱うかを正しく理解する方法を見つけようとしています。データベースのコピーを作成する - 'Identity'仕様の使用に失敗しました

私はこれを行うためにスクリプトを生成する必要がある元の理由は、SQLデータベースを古いバージョンにダウングレードする必要があるためです。私はデータベース(v10.5)のすべてが古いバージョン(v10.0)と互換性があることを知っています。私が直面している問題は、データベースをコピーする3つの異なる方法のうち、元のIDフィールド(ID)を維持できないという事実が常に失敗することです。

私のすべてのテーブルは、最初のカラムがID: Int = PK & Identityです。 1、2、3、5、8、12、13など、テーブルが完全に連続していないケースもたくさんあります。これは過去にレコードが削除されたためです。しかし、元のID番号を以前と同じ順序で再挿入することは不可能だと思われます...

どのようにして(バックアップ/復元なしで)サーバーAからデータベース全体をコピーしますかサーバーBに?注:両方のサーバーの両方のデータベースにManagement Studioから接続できます。また、宛先サーバーは私のものではなく、共有されたホストされたDBであり、自分のデータベースにのみアクセスできます。私は宛先サーバの設定を変更する権限がありません。

私は次のことを試してみた:

  • バックアップ/データベースを復元し、データベース全体のオプション
  • エクスポートデータベースオプション
  • のためのスクリプトを生成します - ので、バージョンミスマッチの

を失敗しました私は、すべてのテーブルでIDの指定を一時的に「無効にする」必要があるかもしれないと推測しています。データを挿入してから、IDを再びオンに戻してください。しかし私はデータベース構造を操作するためのスクリプトを書くことには恐ろしいです。データそのもの、私はすることができます。しかし、データベース構造を操作するために、私はこれまでスクリプトに取り組む時間をとらえていないツールを使用することに慣れてきました - そして、この特定のシナリオ以外では、私はどちらも学ぶ必要がないことを願っています。

+3

挿入のために 'SET IDENTITY_INSERT MyTableName ON'を実行するだけで、クエリの' INSERT'と 'SELECT'部分の両方にあなたのカラムリストをリストするだけです。 – JNK

答えて

1

私は実際にそれを理解しました。アイデンティティの仕様を一時的に無効にする方法が必要であることはすでに知っていましたが、解決策は少し異なりました。アイデンティティの仕様を「無効にする」と「再有効にする」のではなく、IDENTITY_INSERTという別のコマンドがあります。これをオンにすると、IDフィールドに値を挿入できます。オフも。 IDENTITY_INSERTスイッチはセッションごとに接続されているため、他のセッションには影響しません。 IDENTITY_INSERTがオンの場合、プライマリキーの制約内にある限り、そのIDフィールドの特定の値を持つレコードを挿入できます。

SET IDENTITY_INSERT MyTableName ONを使用してスクリプトを作成するのではなく、(SQL管理スタジオの)データベースエクスポートユーティリティで、テーブルを選択してすべてのテーブルを選択し、IDENTITY_INSERTを使用する詳細設定を選択します。

関連する問題