同じサーバー上の新しいデータベースにデータベースのコピーを作成しようとしています。サーバーは、WindowsXPでSQL2008Expressを実行しているローカルコンピューターです。これを行うには、SMO.Transferクラスを使用すると非常に簡単で、ほとんど機能します。
私のコードは次のとおりです(やや簡略化されています):
Server server = new Server("server");
Database sourceDatabase = server.Databases["source database"];
Database newDatbase = new Database(server, "new name");
newDatbase.Create();
Transfer transfer = new Transfer(sourceDatabase);
transfer.CopyAllObjects = true;
transfer.Options.WithDependencies = true;
transfer.DestinationDatabase = newDatbase.Name;
transfer.CopySchema = true;
transfer.CopyData = true;
StringCollection transferScript = transfer.ScriptTransfer();
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
using (SqlCommand switchDatabase = new SqlCommand("USE " + newDatbase.Name, conn))
{
switchDatabase.ExecuteNonQuery();
}
foreach (string scriptLine in transferScript)
{
using (SqlCommand scriptCmd = new SqlCommand(scriptLine, conn, transaction))
{
int res = scriptCmd.ExecuteNonQuery();
}
}
}
ここで行うことは、最初に新しいデータベースを作成し、次にTransfer
クラスを使用してコピースクリプトを生成し、最後に新しいデータベースでスクリプトを実行することです。
これは構造をコピーするためにうまく機能しますが、CopyData
オプションは機能しません!
オプションに文書化されていない制限はありCopyData
ますか?ドキュメントには、オプションでデータをコピーするかどうかを指定するだけであると記載されています。
TransferData()
スクリプトを使用せずにデータベースをコピーするメソッドを使用しようとしましたが、「サーバーへの接続に失敗しました」という例外が発生し、「への接続の確立中にネットワーク関連またはインスタンス固有のエラーが発生しました」という内部例外が発生します。 SQL Server。サーバーが見つからないか、アクセスできませんでした。インスタンス名が正しいこと、およびSQL Serverがリモート接続を許可するように構成されていることを確認してください(プロバイダー:Named Pipes Provider、エラー:40-SQLServerへの接続を開くことができませんでした)」
また、サーバーで名前付きパイプを有効にしようとしましたが、それは役に立ちません。
編集:バックアップを作成してから新しいデータベースに復元することで機能するソリューションを見つけました。しかし、それはかなり不器用で、本来よりも遅いので、私はまだより良い解決策を探しています。