web-dev-qa-db-ja.com

ストアドプロシージャではなくすべてのテーブルを復元できますか?

SQL Server 2008 R2の運用バックアップファイルから定期的に復元して新しいデータを取得するテストデータベースがあります。プロダクションのストアドプロシージャと比較してデータをテストするために、テストDBのストアドプロシージャを編集、変更、または更新することがよくあります。

ストアドプロシージャではなく、テーブルを更新または復元するだけですか?必要な変更に戻すためにそれらを再編集する必要はありませんか?

これらのデータベース(本番およびテスト)は両方とも1つのサーバーにあります。

私のDBサイズは約5 GBで、サードパーティのツールを購入する余裕はありません。

7
Shayma Ahmad

SQLServerでは、テーブルのみをバックアップ/復元するオプションはありません。 SSISパッケージを作成して、特定の/すべてのテーブルからデータをインポートし、SQLエージェントを使用してスケジュールするか、手動で実行できます。

プロダクションデータベースとテストデータベースの両方が同じサーバー上にあるため、リモートサーバーからデータをプルするよりもデータの読み込みが速くなる可能性があります。運用データベースの負荷を最小限に抑えるには、バックアップを新しいデータベースに復元してから、データをテストデータベースにインポートします。

更新のためにテーブルを削除して再作成する場合は、データのインポート後にインデックスが作成されることを確認してください。

または、既存のテーブルに一括インポートする場合は、インデックスを削除して後で再作成し、復旧モデルをシンプルまたは一括ログに変更します。

非常に大きなテーブルがほとんどない場合は、個別のファイルグループに移動して、部分的なバックアップと復元を行うことを検討してください。

オブジェクトレベルの復元には、 Dell LitespeedIdera virtual database または Apex SQL restore などのサードパートツールを試すこともできます。

2
sql_handle

はい、データベースBACKUP/RESTOREを使用しないで、これを実行できます。代わりに、SQL Serverデータツール(SSDT)の一部である SqlPackage.exe ユーティリティを使用します。このユーティリティは通常、Visual StudioのデータベースプロジェクトをSQL Serverに移行するのに役立ちます。ただし、データベースからスキーマとデータをファイルに抽出し、そのファイル内のすべてを別のデータベースにプッシュすることもできます。

スキーマとデータを抽出し、テーブルとデータのみを公開するCMDスクリプトGetDataFromProduction.cmdを作成しました。ストアドプロシージャ、関数などは。dacpacファイルに抽出されます(その方法はありません)が、コンテンツをデータベースに公開するときに除外できます。次のスクリプトはSqlPackage.exeを2回呼び出します。1回は/Action:Extractで、もう1回は/Action:Publishで呼び出します。 「抽出」で/p:ExtractAllTableData=Trueを使用して、すべてのテーブルのデータを取得します。

@ECHO OFF

"C:\Program Files (x86)\Microsoft SQL Server\120\DAC\bin\SqlPackage.exe" ^
    /Action:Extract ^
    /SourceDatabaseName:TEMPTEST ^
    /SourceServerName:(local) ^
    /TargetFile:C:\TEMP\_Extract.dacpac ^
    /p:IgnoreExtendedProperties=True ^
    /p:ExtractAllTableData=True

ECHO Hit the "any" key to publish the extracted data
PAUSE

"C:\Program Files (x86)\Microsoft SQL Server\120\DAC\bin\SqlPackage.exe" ^
    /Action:Publish ^
    /SourceFile:C:\TEMP\_Extract.dacpac ^
    /TargetDatabaseName:TestPublish ^
    /TargetServerName:(local) ^
    /p:DropObjectsNotInSource=False ^
    /p:ExcludeObjectTypes=Aggregates;ApplicationRoles;Assemblies;AsymmetricKeys;^
BrokerPriorities;Certificates;Contracts;DatabaseRoles;DatabaseTriggers;^
ExtendedProperties;FileTables;MessageTypes;Permissions;Queues;RemoteServiceBindings;^
RoleMembership;Rules;ScalarValuedFunctions;SearchPropertyLists;Sequences;Services;^
Signatures;StoredProcedures;SymmetricKeys;Synonyms;TableValuedFunctions;^
UserDefinedDataTypes;UserDefinedTableTypes;ClrUserDefinedTypes;Views;Audits;Credentials;^
CryptographicProviders;DatabaseAuditSpecifications;Endpoints;ErrorMessages;^
EventNotifications;EventSessions;LinkedServerLogins;LinkedServers;Routes;^
ServerAuditSpecifications;ServerRoleMembership;ServerRoles;ServerTriggers;^
ColumnEncryptionKeys;ColumnMasterKeys;Defaults;ExternalDataSources;ExternalFileFormats;^
ExternalTables;Filegroups;FullTextCatalogs;FullTextStoplists;PartitionFunctions;^
PartitionSchemes;SecurityPolicies;Users;XmlSchemaCollections;DatabaseScopedCredentials;^
Logins


PAUSE

allテーブルのデータが不要な場合は、取得する個々のテーブルを指定できます。 SqlPackageに1つまたは2つを除くすべてのテーブルを取得するように指示するオプションはないことに注意してください。 1つまたは2つを除くすべてが必要な場合は、取得するすべてのテーブルを指定する必要があります。個々のテーブルを指定するときは、最初に/p:ExtractAllTableData=False(上の例ではTrue)を指定してから、新しい "プロパティ"を追加して、各テーブルを "SchemaName.TableName"形式で指定する必要があります。

    /p:TableData="dbo.Table1" ^
    /p:TableData="Orders.Order" ^
    /p:TableData="Orders.OrderItems"

ご覧のとおり、/p:TableData="SchemaName.TableName"は必要な回数だけ指定できます。残念ながら、「SchemaName。%」またはそのようなものにワイルドカードを指定する機能はないように見えます(これは物事が簡単になりすぎて、何が楽しいのでしょうか?)。ただし、次のコードを使用してテーブルのリストを生成し、コピーして[〜#〜] cmd [〜#〜]スクリプトに貼り付けるだけです。

SELECT N'   /p:TableData="'
        + SCHEMA_NAME(tbl.[schema_id])
        + N'.'
        + OBJECT_NAME(tbl.[object_id])
        + N'" ^'
FROM sys.tables tbl;

このメソッドはここで要求されていることを正確に実行しますが、これが管理できなくなるデータ量を推定する根拠がないことにも注意してください。データベースが/p:ExtractAllTableData=Trueに対して大きすぎる場合は、/p:ExtractAllTableData=Falseを指定して、管理可能なテーブルのサブセットを指定し、2つ以上のテーブルでこれを繰り返すことで、移行を細かく分割できると思いますスクリプト。

そうは言っても、既存のスキーマとデータを。dacpacファイルにあるものと一致させるために必要な変更を行うので、データ同期は非常にうまく処理されます。最初にテーブルを切り捨てたり、そのようなことをする必要はありません。

Visual StudioまたはSSDT、あるいはその両方がまだインストールされていない場合は、次の場所からSSDTを単独で入手できます。 Download Latest SQL Server Data Tools


関連トピックについて:

プロダクションのストアドプロシージャと比較してデータをテストするために、テストDBのストアドプロシージャを編集、変更、または更新することがよくあります。

なぜストアドプロシージャを変更するのですか?これを行うか、または行う必要がある場合は、リリースプロセスやアーキテクチャに改善の余地がある問題を指摘している可能性があります。一般的に言って、異なるデータセットに一致するようにコードを変更するべきではありません。これは、コードに顧客情報をハードコーディングしている(いくつかの理由で非常に悪い)か、URLやファイルパスなど、環境に敏感な情報をハードコーディングしていることを意味します。ハードコーディングしてはなりません;すべて設定ファイルや設定テーブルの値から取得する必要があります。また、EnvironmentNameまたはEnvironmentIDのフィールドがある構成テーブルを作成して、すべての環境でまったく同じデータを取得できるようにすることができます。その後、単一の関数で現在の環境。これは、構成テーブルに対するフィルタリングに使用されます。同じリリーススクリプト(通常はすべての環境の値を含む)がすべての環境で実行され、実行されている環境を確認するためのIF条件を必要としないため、構成データを追加/更新/削除するときのリリースプロセスが簡単になります。

この回答に関するO.P.からのコメント:

残念ながら、承認を得ずにパッケージをインストールすることはできません

このアプローチでは、SQL Serverを実行しているサーバーに技術的にインストールする必要はありません。 SqlPackageは、SQLCLD、SSMSなどのクライアントツールです。ソースサーバーに接続できるコンピューターにインストールする必要があります。したがって、ITローカルPCにインストールすることはできません。おそらく、インストール先のどこかに開発サーバーまたはQAサーバーを見つけることができます。

10
Solomon Rutzky

コミュニティWiki 質問に残されたコメントから作成された回答:

1つのオプションは、ストアドプロシージャを別のデータベースに格納することです(必要に応じて同義語を使用します)。 「ただテーブルをバックアップする」と言う方法はありません。レプリケーションなどのメカニズムを使用するか、すべてをコピーに復元してから、テーブルのみをインポート/エクスポート/ SSIS/BCPする必要があります。

「サードパーティのツールを購入する余裕はありません」-場合によっては、購入する余裕がないこともあります。一般的なソフトウェアを何度も書き直すと、技術的にはチェックを書く手間が省けますが、チェックが無料になるわけではありません。 ホイールを再発明するためのコスト をお読みください(上司、またはソフトウェアの購入を許可する人や給与を支払う人にも読んでください)。 - Aaron Bertrand

ストアドプロシージャ(およびその他のデータベースオブジェクト)をソース管理下に置くことを検討してください。これにより、運用環境の復元後に再展開できます。 - ダングズマン


コミュニティのwikiの投稿は、他の人が編集して最新の状態に保ち、有用な情報を追加し、一般に品質を向上させることを期待して、コミュニティに寄付されました。

2
user126897

または、SSMSを使用して、ストアドプロシージャと関数を開発データベースからファイルにスクリプト化できます。開発用DBを介して製品のバックアップを復元します。次に、スクリプトを実行して、prodのプロシージャと関数をdevのプロシージャと関数に置き換えます。

  • SSMSで、開発データベースを右クリックし、[タスク]、[スクリプトの生成]の順に選択します。
  • 表示されるウィザードで、「ストアドプロシージャ」(および、適切な場合は「ユーザー定義関数」)を選択します。
  • 次のウィンドウで[詳細設定]ボタンをクリックして、スクリプト生成のオプションを設定できるダイアログウィンドウを開きます。 [スクリプトのドロップと作成]オプションまでスクロールし、[スクリプトのドロップと作成]に設定します。 「OK」をクリックします。
  • スクリプトファイルのパスと名前を指定し(このために必ず1つのファイルに書き込みます)、ウィザードを終了します。

結果のファイルには、製品の手順と関数を開発のものに置き換えるために必要なコードが含まれます。

0
RDFozz