web-dev-qa-db-ja.com

SQL Server Management Studio 2008で「スクリプトを生成する」タスクを自動化するにはどうすればよいですか?

SQL Server Management Studio 2008のスクリプト生成を自動化したい。

今私がしていることは:

  • データベース、タスク、「スクリプトの生成...」を右クリックします
  • 必要なすべてのエクスポートオプションを手動で選択し、[オブジェクトの選択]タブで[すべて選択]をクリックします
  • エクスポートフォルダーを選択します
  • 最終的に「完了」ボタンを押します

このタスクを自動化する方法はありますか?

編集:creationスクリプトを生成し、スクリプトを変更しません。

90
Brann

BrannがVisual Studio 2008 SP1 Team Suiteから言及しているのは、データベース公開ウィザードのバージョン1.4です。これは、SQL Server 2008(おそらくプロのみ)と共に\ Program Files\Microsoft SQL Server\90\Tools\Publishing\1.4にインストールされます。サーバーエクスプローラーからのVS呼び出しは、単にこれを呼び出しています。次のようなコマンドラインを使用して同じ機能を実現できます。

sqlpubwiz help script

V1.4にv1.1と同じ問題があるかどうかはわかりません(ユーザーがロールに変換され、制約が正しい順序で作成されません)が、オブジェクトをスクリプト化しないため、私にとっては解決策ではありませんSSMSの[タスク]-> [スクリプトの生成]オプションのような異なるファイルに。現在、データベース公開ウィザード(sqlpubwiz.exe)の改良版として機能するScriptioの修正版(MS SMO APIを使用)を使用しています。現在、コマンドラインからスクリプト化することはできません。将来的にはその貢献を追加するかもしれません。

Scriptioは元々Bill Grazianoのブログに投稿されていましたが、その後BillによってCodePlexにリリースされ、他の人によって更新されました。議論を読んで、SQL Server 2008で使用するためのコンパイル方法を確認してください。

http://scriptio.codeplex.com/

編集:私はそれ以来、RedGateのSQL Compare製品を使い始めました。これは、SQLパブリッシングウィザードがすべきであったすべての非常に素晴らしい代替品です。ソースとしてデータベース、バックアップ、またはスナップショットを選択し、出力場所としてフォルダーを選択すると、すべてがフォルダー構造にうまくダンプされます。たまたま他の製品であるSQL Source Controlが使用しているのと同じ形式です。

31
noobish

SqlPubwizには、SSMSでのスクリプト生成と比較して非常に限られたオプションがあります。対照的に、 [〜#〜] smo [〜#〜] で使用可能なオプションは、SSMSのオプションとほぼ完全に一致しており、おそらく同じコードであることを示唆しています。 (MSが2回書かなかったことを願っています!)MSDNには this one のようないくつかの例があり、スクリプトテーブルを個別のオブジェクトとして表示します。ただし、外部キーなどの「DRI」(宣言参照整合性)オブジェクトを含む「フル」スキーマですべてを正しくスクリプト化する場合、テーブルを個別にスクリプト化しても依存関係が正しく機能しません。すべてのURNを収集し、配列としてスクリプト作成者に渡す必要があることがわかりました。例から変更したこのコードは、私のために機能します(私はあなたがそれを片付けて、もう少しコメントすることができたと思いますが):

using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Sdk.Sfc;
...
// Connect to the local, default instance of SQL Server. 
Server srv = new Server();

// Reference the database.  
Database db = srv.Databases["YOURDBHERE"];

Scripter scrp = new Scripter(srv);
scrp.Options.ScriptDrops = false;
scrp.Options.WithDependencies = true;
scrp.Options.Indexes = true;   // To include indexes
scrp.Options.DriAllConstraints = true;   // to include referential constraints in the script
scrp.Options.Triggers = true;
scrp.Options.FullTextIndexes = true;
scrp.Options.NoCollation = false;
scrp.Options.Bindings = true;
scrp.Options.IncludeIfNotExists = false;
scrp.Options.ScriptBatchTerminator = true;
scrp.Options.ExtendedProperties = true;

scrp.PrefetchObjects = true; // some sources suggest this may speed things up

var urns = new List<Urn>();

// Iterate through the tables in database and script each one   
foreach (Table tb in db.Tables)
{
    // check if the table is not a system table
    if (tb.IsSystemObject == false)
    {
        urns.Add(tb.Urn);
    }
}

// Iterate through the views in database and script each one. Display the script.   
foreach (View view in db.Views)
{
    // check if the view is not a system object
    if (view.IsSystemObject == false)
    {
        urns.Add(view.Urn);
    }
}

// Iterate through the stored procedures in database and script each one. Display the script.   
foreach (StoredProcedure sp in db.StoredProcedures)
{
    // check if the procedure is not a system object
    if (sp.IsSystemObject == false)
    {
        urns.Add(sp.Urn);
    }
}

StringBuilder builder = new StringBuilder();
System.Collections.Specialized.StringCollection sc = scrp.Script(urns.ToArray());
foreach (string st in sc)
{
    // It seems each string is a sensible batch, and putting GO after it makes it work in tools like SSMS.
    // Wrapping each string in an 'exec' statement would work better if using SqlCommand to run the script.
    builder.AppendLine(st);
    builder.AppendLine("GO");
}

return builder.ToString();
38
OlduwanSteve

これを行う SchemaZen という名前のオープンソースコマンドラインユーティリティを作成しました。管理スタジオからのスクリプティングよりもはるかに高速であり、出力はバージョン管理に適しています。スキーマとデータの両方のスクリプトをサポートします。

スクリプトを生成するには:

schemazen.exeスクリプト--server localhost --database db --scriptDir c:\ somedir

次に、スクリプトを実行してデータベースを再作成します。

schemazen.exe create --server localhost --database db --scriptDir c:\ somedir
13
Seth Reno

SQL Server管理オブジェクト(SMO)を使用して、スクリプトの生成を含むSQL Server 2005管理タスクを自動化できます。 http://msdn.Microsoft.com/en-us/library/ms162169。 aspx

12
Joe

私はこれらの回答のいずれにも言及されたSQLPSXのPowerShellを見ていません...私は個人的にそれで遊んでいませんが、美しく使いやすく、この種の自動化タスクに理想的に適しています:

Get-SqlDatabase -dbname test -sqlserver server | Get-SqlTable | Get-SqlScripter | Set-Content -Path C:\script.sql
Get-SqlDatabase -dbname test -sqlserver server | Get-SqlStoredProcedure | Get-SqlScripter
Get-SqlDatabase -dbname test -sqlserver server | Get-SqlView | Get-SqlScripter

(参照: http://www.sqlservercentral.com/Forums/Topic1167710-1550-1.aspx#bm11681

プロジェクトページ: http://sqlpsx.codeplex.com/

このアプローチの主な利点は、SMOを直接使用する構成/カスタマイズ可能性と、データベース公開ウィザードのような単純な既存のツールを使用する便利さと保守性を組み合わせていることです。

7
Tao

開発者の方は、間違いなくSMOを使用してください。開始点であるScripterクラスへのリンクを次に示します。

スクリプトクラス

7
Ryan Lundy

[ツール]> [オプション]> [デザイナ]> [テーブルおよびデータベースデザイナ]には、[変更スクリプトを自動生成する]オプションがあり、保存時に行うすべての変更に対して1つのスクリプトを生成します。

4
John Sheehan

INFORMATION_SCHEMAテーブルを使用して、T-SQLコードでそれを行うことができます。

サードパーティのツールもあります-あなたが話している用途を正確に知るためにApex SQL Scriptが好きです。コマンドラインから完全に実行します。

3
Cade Roux

新しいSQL Serverコマンドラインツールを試して、T-SQLスクリプトを生成し、動的管理ビューを監視します。

魅力のように私のために働いた。これは、コマンドラインから実行するMicrosoftの新しいpythonベースのツールです。すべてMicrosoftのページ(以下のリンクを参照)で説明されているように機能します)。

Pipでインストールします:

$ pip install mssql-scripter

ヘルプ用のhを使用した通常のコマンドパラメーターの概要:

mssql-scripter -h

ヒント:Windows認証を介してSQL-Serverにログインする場合は、ユーザー名とパスワードをそのままにしてください。

https://cloudblogs.Microsoft.com/sqlserver/2017/05/17/try-new-sql-server-command-line-tools-to-generate-t-sql-scripts-and-monitor- dynamic-management-views /

3
matthhias

マイクロソフトのソリューションが必要な場合は、Microsoft SQL Server Database Publishing Wizard 1.1

http://www.Microsoft.com/downloads/details.aspx?FamilyId=56E5B1C5-BF17-42E0-A410-371A838E570A&displaylang=en

スクリプトを再構築する必要があるときにいつでも実行できるバッチプロセスを作成します。

2
Glennular

私はDB Comparerを使用してきました-その無料で大騒ぎではないDB全体のスクリプトで、別のDBと比較したり、Diffスクリプトを作成することもできます。開発から本番への変更スクリプトに最適です。 http://www.dbcomparer.com/

2
MartinC

私のニーズに合わせて作成したこの簡単なコマンドラインツールもあります。
http://mycodepad.wordpress.com/2013/11/18/export-ms-sql-database-schema-with-c/

データベース全体をエクスポートでき、暗号化されたオブジェクトをエクスポートしようとします。ファイル比較を簡単にするために、すべてがフォルダーと個別のsqlファイルに保存されます。

コードはgithubでも入手できます。

1
George Kosmidis

VS 2012(MSSQL Server 2008上のDB用)を使用しています。データベースの比較には、データベースを保存するオプション、比較、およびオプションがあります。これは、基本的に配信の設定です。その後、スクリプトを更新または生成できます。

ソリューションエクスプローラーにファイルが表示されないので、後でファイルから読み込む(Windowsエクスプローラーからドラッグアンドドロップする)のは少し厄介です。

0
zhrist

Visual Studio 2008 SP1 TeamSuiteから:

サーバーエクスプローラーの[データ接続]タブには、「Microsoft SQL Serverデータベース公開ウィザード」と同じ機能を提供するプロバイダーツールへの公開がありますが、MS Sql Server 2008と互換性があります。

0
Brann