web-dev-qa-db-ja.com

SMOデータベースをコピーするか、システム以外のすべてのデータベースオブジェクトを削除します

すべてのデータベースオブジェクトを既存の空のデータベースまたは新しいデータベースにコピーするc#SMOスクリプトがあります。

しかし、このアプローチには2つの問題があります

  1. 既存のデータベースは空ではありません。手動による介入が必要です。
  2. 新しいデータベースには、DB所有者、ディスク管理などのさまざまなオプションがあります。

あるインスタンスから別のインスタンスに既存のデータベースのクローンを作成する必要があり、現在はデータベースオブジェクトのみをコピーできるため、私の質問は

  1. 既存のものの設定に応じて新しいデータベースを作成することは可能ですか?
  2. 依存関係に関係なく、既存のデータベースからすべてのオブジェクトを削除することは可能ですか?

私のスクリプトは次のようになります

Transfer transfer = new Transfer(databaseSource);
transfer.CopyAllObjects = true;
transfer.CopyAllUsers = true;
transfer.Options.WithDependencies = true;
transfer.DestinationServer = serverDestination.Name;
transfer.DestinationDatabase = databaseDestination.Name;
transfer.DestinationLoginSecure = true;
transfer.CopySchema = true;
transfer.CopyData = true;
transfer.Options.Permissions = true;
transfer.Options.ContinueScriptingOnError = true;
transfer.TransferData();
2
Muflix

転送を実行する前に、_SELECT * FROM sys.databases d WHERE d.name = '<target_db_name>';_を使用してデータベースの既存の設定を取得できます。結果をDataSetに保存して、後で使用できるようにします。

データベースが存在しない場合、行は返されません。データベースが存在する場合は、最初のステップとして既存のデータベースを削除できます。

TransferData()メソッドを実行した後、DataSetの項目に基づいて必要な構成変更を適用できます。たとえば、_recovery_model_desc_列の内容を使用して、次のコードを実行することにより、リカバリモデルを設定できます。_ALTER DATABASE <target_db_name> SET RECOVERY = 'xxx';_ここで、xxxは列に含まれる値です。

1
Max Vernon