SQL Server 2008から2005へのダウングレード


32

SQL 2008を使用して構築されたデータベースファイルは2005と互換性がありません。回避策はありますか?


サーバーログインもエクスポートすることを忘れないでください。
スタンレージョンズ

これは、2008年に開発しているが、運用サーバーはまだ2005年であるためですか あなたが提供するソリューションは、避けられないものを遅らせると同時に、あなたの人生を悲惨なものにするだけです。
datagod

回答:


16

サードパーティのツールは必要ありません。SQL Server 2008 Management Studioは、「スクリプトデータベース」ウィザードに「スクリプトデータ」オプションを追加したため、データベースをダウンコンバートする非常に強力なツールを提供してくれました。

SQL2008 SSMSでDBを右クリックし、[タスク]、[スクリプトの生成]の順に移動します

ウィザードの説明に従って、テーブル/ビューオプションの下の[スクリプトデータ]で[True]を選択してください。すべてのオブジェクトを選択し、作成したスクリプトを2005サーバーで実行します。(元のデータベースが非常に大きい場合、作成されるスクリプトは巨大になる可能性があることに注意してください!)

SQL2005サーバーに対してウィザードを実行して、SQL2005データベースをSQL2000にダウンコンバートすることもできます(もちろん、ワークステーションに2008ツールをインストールする必要があります)。


4
オフェンスはありませんが、データベースが大きい場合、これは解決策にはなりません。数百万行のテーブルでこの手法を試してください(そして、varchar(max)を単一の列のデータ型と考えてください)、Management Studioがこのファイルを開いて解析できるなら、あなたは満足しますが、私は開かないことを確認し、クラッシュします。申し訳ありませんが、dbが本当に小さい場合を除き、それはこの問題の解決策ではありません。
マリアン

3
確かに、データベースが大きすぎる場合は、データベース構造だけをスクリプト化してから、お好みの方法(SSIS、BCP、インポートウィザード)を使用してデータをプッシュします。
BradC

SSMS 11.0では、構造とともにデータをスクリプト化するオプションはないようです。i.imgur.com/SGkG8oZ.png
jcollum

ああOKそれだけでテーブル/ビューのオプション上記の「スクリプトへのデータの種類」の下で、今だ
jcollum

16

1つのSQL Serverインスタンスから別のインスタンスにデータをBCPできます。これは、あるバージョンから別のバージョンにデータをコピーする最速の方法です。データの量によっては、時間がかかる場合があります。


2
データの量にもよりますが、ほとんど常に長い時間がかかります
jcolebrand

うん、確かにそうだ。大規模なデータベースを古いバージョンのSQL Serverに移行するのは簡単なことではありません。
mrdenny

2
BCPの利点は、スクリプトデータを使用するよりも高速になることです。はい、遅いですが、多くの選択肢よりも高速です。
ジェレマイアペシュカ

15

残念ながら、2008年の形式から2005年の形式にDBをダウングレードする直接的な方法はありません。

私が過去にこれを行った方法(実際には古いバージョンのSQLサーバーで、しかしプロセスは同じです):

  1. まだ実行されていない場合は、SQL2008インスタンスでDBを復元します
  2. SQL2005インスタンスで、正しい構造(テーブル、インデックス、制約、ビュー、プロシージャ、トリガーなど)で空のDBを構築します。既存のビルド手順やソースコードからこれを行うことができますが、そうでない場合は、SQL Server Managerを使用して2005 DBのすべてのスクリプトを作成し、2008インスタンスの空のスクリプトで結果を実行できます。
  3. 2つのインスタンスが相互に認識できることを確認し(インスタンスが異なるマシン上にある場合、接続をブロックするファイアウォールがない)、sp_addlinkedserverを使用してそれらをリンクします。
  4. すべてのデータを1つのDBから別のDBにコピーします。トリガーに外部キーの制約や同様の問題がない場合は、DBをリンクし、テーブルのリスト(sys.objectsから選択)を介してカーソルを移動して実行できます
    INSERT destinationserver.destinationdb.schema.table SELECT * FROM sourcedb.schema.table
    (またはINSERT schema.table SELECT * FROM sourceserver.sourcedb.schema.table、インスタンスをそのようにリンクしている場合) )
    各テーブル。制約とトリガーを強制するテーブル間の一貫性がある場合は、特に、それ自体に基づいた制約を持つテーブル(1つの保持階層)のような周期的制約がある場合、これらの操作の順序についてもう少し賢くする必要がありますデータ、可能な例として)。

最初にデータをコピーし、手順3の後に他のすべての構造(インデックス、プロシージャ、トリガーなど)を追加する方が効率的です。これにより、制約とトリガーに起因する行挿入順序の問題を回避し、理論的には、すべてのデータが追加されるため、構築よりも早く終了する必要がありますが、テーブルにクラスター化インデックスがある場合、データを追加する前にこれらを作成してください。

もちろん、これはすべてのオブジェクトがSQL 2008固有の機能を使用していないことを前提としています。スキーマの再構築時にエラーが発生した場合、SQL 2008固有の機能を見つけることができます。コードのいずれかが、SQL Serverのバージョン間でたまたま公式に定義されていない動作に依存している場合、後から探し出して解決するための、より微妙でとらえどころのないバグがあるかもしれません。


1
-1。これは、BCPの同類と比較して、実際には非効率的です(*から選択)。
jcolebrand

@jcolebrandは効率性について十分です。テクニックは私が仕事をしてきたものですが。
デビッドスピレット

公正なシステムです。将来の読者のためにここに含めると思いました。あなたは現在、それが問題にならないことについて賛成票を持っています。;)
jcolebrand


1

最初にデータベースのスクリプトを作成し、ダウングレードするタイプを指定したバージョンで確認する必要があります。また、データを上位バージョンから下位バージョンにコピーするには、SQL Data compareが役立ちます。

がんばろう!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.