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


97

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

今私がしていることは:

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

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

編集:変更スクリプトではなく、作成スクリプトを生成したい。


あなたは答えを見つけましたか?私もこれを実行したいのですが、パブリッシングを使用しました。ハードに保存されました。スクリプトを生成するときのオプションがどこにあるのかわからないのです。
Alexa Adrian

1
いくつかの回答で述べたように、開発者はSMOを使用してください
Jay Jay Jay

回答:


31

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

sqlpubwiz help script

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

ScriptioはもともとBill Grazianoのブログに投稿されていましたが、その後BillによってCodePlexにリリースされ、他のユーザーによって更新されました。SQL Server 2008で使用するためにコンパイルする方法については、ディスカッションを読んでください。

http://scriptio.codeplex.com/

編集:RedGateのSQL Compare製品を使用してこれを開始しました。これは、SQLパブリッシングウィザードのすべてを置き換える非常に優れた方法です。ソースとしてデータベース、バックアップ、またはスナップショットを選択し、出力場所としてフォルダーを選択すると、すべてがフォルダー構造に適切にダンプされます。これは、他の製品であるSQLソース管理が使用する形式と同じです。


2012年に同等のものはありますか?ウィザードが「スクリプトインデックス」などの設定を覚えていれば幸いです。
PeterX 2014年

6
@PeterX SMSS>ツール>オプション> SQL Serverオブジェクトエクスプローラー>スクリプティング
zanlok

1
2012年については、このガイドに従ってください:simple-talk.com/sql/database-administration/...
サイモン・ハチソン

@zanlokの非常に役立つコメント。残念ながら、彼らは、SQL Serverの2014年の「サポートされていないステートメントを含める」オプション不足している
jk7

42

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

    using Microsoft.SqlServer.Management.Smo;
    using Microsoft.SqlServer.Management.Sdk.Sfc;
    // etc...

    // 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();

9
Microsoft.SqlServer.Management.SqlScriptPublish.ScriptPublishWizardアセンブリC:\ Program Files(x86)\ Microsoft SQL Server \ 110 \ Tools \ Binn \ ManagementStudio \ Microsoft.SqlServer.Management.SqlScriptPublishUI.dllからクラスを確認できます。これはSSMSが使用するものです。(または、Microsoft.SqlServer.Management.UI.GenerateScriptアセンブリC:\ Program Files(x86)\ Microsoft SQL Server \ 110 \ Tools \ Binn \ ManagementStudio \ ReplicationDialog.dllからクラスを確認することもできます。)
cubetwo1729

ここでのサンプルコードとリンクは素晴らしいスタートであり、OPに対する最も完全な回答になるはずです(これも私の質問でした)。
zanlok 2015

1
LinuxのコマンドラインからSQLサーバースクリプトを生成できるC#アプリをハッキングしました。必要なのは.Net Core 2プレビューのみです:github.com/mkurz/SQLServerScripter
mkurz

20

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

スクリプトを生成するには、以下を実行します。

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

次に、スクリプトからデータベースを再作成するには、次のコマンドを実行します。

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

SchemaZenを試したところ、本当に感動しました。初めて働いた。セス、ありがとう!
Simon Hughes、

@Sethでは、オブジェクトをスクリプト化するために何を使用していますか?Microsoft.SqlServerへの参照が1つもありませんでした(未使用のusingステートメントが1つありました)。
John

@John-Schema Zenには、スクリプト用の独自のライブラリが含まれています。スキーマをモデルに読み込み、モデルに基づいてスクリプトを生成します。簡単な例については、github.com / sethreno / schemazen / blob / master / model / Models /…を参照してください。
Seth Reno



7

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#bm1168100

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

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


1
私はこのソリューションを試すのにしばらく費やしましたが、最終的にはC#を使用してSMOを使用しました。私が簡単に過去を見つけることができなかった問題は、サンプルコードが各テーブルを個別にスクリプト化することです。外部キーのような 'DRI'(宣言的参照整合性)オブジェクトを追加し始めると、依存関係が正しくなくなり、非常に遅くなります。
OlduwanSteve

4

[ツール]> [オプション]> [デザイナ]> [テーブルおよびデータベースデザイナ]には、[変更スクリプトの自動生成]のオプションがあり、保存時に行った変更ごとに1つ生成されます。


3
それは私が必要とするものではありません。作成スクリプトを入手したい(私の最終的な目標は、これらのファイルをソース管理システムに自動的にチェックインすることです)
Brann

3

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

サードパーティのツールもあります。私は、あなたが話している用途にぴったりのApex SQLスクリプトを気に入っています。コマンドラインから完全に実行します。


3

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

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

あなたはそれをpipでインストールします:

$ pip 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-ビュー/


2

Microsoftのソリューションが必要な場合は、Microsoft SQL Serverデータベース公開ウィザード1.1を試してください。

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

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


1
残念ながら、SqlServer 2008をサポートしていません
Brann

1
バージョン1.2は、2000と2005をサポートしていると述べていますが、2008年に3800以上のテーブルを持つデータベースをスクリプト化するために使用しただけで、問題なく動作しました。2008年まで導入されなかった圧縮オプションは含まれていませんでした。2008R2データベースに対してもテストを行ったところ、スクリプトも同様にうまく機能しました。
ジェレミー

2

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


1

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

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

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


0

Visual Studio 2008 SP1 TeamSuiteから:

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


タスクの自動化にどのように役立ちますか?
Serge Wautier、2011

0

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

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

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