Bagaimana cara mengotomatiskan tugas "menghasilkan skrip" di SQL Server Management Studio 2008?

97

Saya ingin mengotomatiskan pembuatan skrip di SQL Server Management Studio 2008.

Saat ini yang saya lakukan adalah:

  • Klik kanan pada database saya, Tasks, "Generate Scripts ..."
  • secara manual pilih semua opsi ekspor yang saya butuhkan, dan tekan pilih semua pada tab "pilih objek"
  • Pilih folder ekspor
  • Akhirnya tekan tombol "Selesai"

Apakah ada cara untuk mengotomatiskan tugas ini?

Edit: Saya ingin membuat skrip kreasi , bukan mengubah skrip.

Brann
sumber
apakah kamu menemukan jawabannya? Saya ingin melakukan ini juga, saya menggunakan Publishing, disimpan di hard, tidak tahu di mana dan di sana Saya tidak memiliki semua opsi yang ada saat membuat skrip: -?
Alexa Adrian
1
Seperti yang disebutkan dalam beberapa jawaban, Gunakan SMO jika Anda seorang pengembang
Jay Jay Jay

Jawaban:

31

Apa yang disebutkan Brann dari Visual Studio 2008 SP1 Team Suite adalah versi 1.4 dari Database Publishing Wizard. Ini diinstal dengan sql server 2008 (mungkin hanya profesional?) Ke \ Program Files \ Microsoft SQL Server \ 90 \ Tools \ Publishing \ 1.4. Panggilan VS dari server explorer hanya memanggil ini. Anda dapat mencapai fungsi yang sama melalui baris perintah seperti:

sqlpubwiz help script

Saya tidak tahu apakah v1.4 memiliki masalah yang sama dengan v1.1 (pengguna diubah menjadi peran, batasan tidak dibuat dalam urutan yang benar), tetapi ini bukan solusi bagi saya karena tidak membuat skrip objek ke file yang berbeda seperti opsi Tasks-> Generate Scripts di SSMS. Saat ini saya menggunakan versi Scriptio yang dimodifikasi (menggunakan MS SMO API) untuk bertindak sebagai pengganti yang lebih baik untuk wizard penerbitan database (sqlpubwiz.exe). Saat ini tidak dapat ditulis dari baris perintah, saya mungkin menambahkan kontribusi itu di masa mendatang.

Scriptio awalnya diposting di blog Bill Graziano, tetapi kemudian dirilis ke CodePlex oleh Bill dan diperbarui oleh orang lain. Baca diskusi untuk mengetahui cara mengompilasi untuk digunakan dengan SQL Server 2008.

http://scriptio.codeplex.com/

EDIT: Saya sudah mulai menggunakan produk Perbandingan SQL RedGate untuk melakukan ini. Ini adalah pengganti yang sangat bagus untuk semua wizard penerbitan sql yang seharusnya. Anda memilih database, backup, atau snapshot sebagai sumber, dan folder sebagai lokasi keluaran dan membuang semuanya dengan baik ke dalam struktur folder. Ini kebetulan memiliki format yang sama dengan produk mereka yang lain, Kontrol Sumber SQL, menggunakan.

noobish
sumber
Apakah ada yang setara di tahun 2012? Saya akan senang jika wizard mengingat pengaturan saya seperti "Indeks Skrip".
PeterX
6
@PeterX SMSS> Alat> Opsi> SQL Server Object Explorer> Scripting
zanlok
1
Untuk tahun 2012, ikuti panduan ini: simple-talk.com/sql/database-administration/…
Simon Hutchison
@zanlok komentar yang sangat berguna. Sayangnya mereka tidak memiliki opsi "Sertakan pernyataan yang tidak didukung" di SQL Server 2014.
jk7
42

SqlPubwiz memiliki opsi yang sangat terbatas dibandingkan dengan pembuatan skrip di SSMS. Sebaliknya, opsi yang tersedia dengan SMO hampir sama persis dengan yang ada di SSMS, menunjukkan bahwa kode itu bahkan mungkin sama. (Saya berharap MS tidak menulisnya dua kali!) Ada beberapa contoh di MSDN seperti ini yang menunjukkan tabel skrip sebagai objek individual. Namun jika Anda ingin semuanya dibuat skrip dengan benar dengan skema 'lengkap' yang menyertakan objek 'DRI' (Integritas Referensial Deklaratif) seperti kunci asing, maka tabel skrip secara individual tidak akan menjalankan dependensi dengan benar. Saya merasa perlu untuk mengumpulkan semua URN dan menyerahkannya ke skrip sebagai array. Kode ini, dimodifikasi dari contoh,

    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();
OlduwanSteve
sumber
9
Anda dapat melihat kelas Microsoft.SqlServer.Management.SqlScriptPublish.ScriptPublishWizarddari rakitan C: \ Program Files (x86) \ Microsoft SQL Server \ 110 \ Tools \ Binn \ ManagementStudio \ Microsoft.SqlServer.Management.SqlScriptPublishUI.dll. Inilah yang digunakan SSMS. (Alternatifnya, Anda dapat melihat kelas Microsoft.SqlServer.Management.UI.GenerateScriptdari rakitan C: \ Program Files (x86) \ Microsoft SQL Server \ 110 \ Tools \ Binn \ ManagementStudio \ ReplicationDialog.dll.)
cubetwo1729
Contoh kode dan tautan di sini adalah permulaan yang bagus, dan harus menjadi jawaban paling lengkap untuk OP (yang juga merupakan pertanyaan tepat saya).
zanlok
1
Saya meretas aplikasi C # yang memungkinkan Anda menghasilkan skrip server SQL dari baris perintah di Linux. Yang Anda butuhkan hanyalah pratinjau .Net Core 2: github.com/mkurz/SQLServerScripter
mkurz
20

Saya menulis utilitas baris perintah open source bernama SchemaZen yang melakukan ini. Ini jauh lebih cepat daripada membuat skrip dari studio manajemen dan keluarannya lebih ramah kontrol versi. Ini mendukung skrip skema dan data.

Untuk menghasilkan skrip, jalankan:

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

Kemudian untuk membuat ulang database dari skrip, jalankan:

schemazen.exe buat --server localhost --database db --scriptDir c: \ somedir
Seth Reno
sumber
Saya baru saja mencoba SchemaZen dan saya sangat terkesan. Bekerja pertama kali. Terima kasih Seth!
Simon Hughes
@ Set jadi apa yang Anda gunakan untuk skrip objek? Saya tidak melihat satu pun referensi ke Microsoft.SqlServer apa pun (yah, ada satu pernyataan penggunaan yang tidak terpakai).
Yohanes
@ John - Schema Zen berisi perpustakaannya sendiri untuk pembuatan skrip. Itu membaca skema menjadi model kemudian menghasilkan skrip berdasarkan model. Lihat github.com/sethreno/schemazen/blob/master/model/Models/… untuk contoh sederhana.
Seth Reno
7

Jika Anda seorang pengembang, pasti menggunakan SMO. Berikut link ke kelas Scripter, yang merupakan titik awal Anda:

Kelas Scripter

Ryan Lundy
sumber
7

Saya tidak melihat PowerShell dengan SQLPSX disebutkan dalam salah satu jawaban ini ... Saya pribadi belum pernah bermain dengannya tetapi terlihat sangat mudah digunakan dan cocok untuk jenis tugas otomatisasi ini, dengan tugas seperti:

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

(ref: http://www.sqlservercentral.com/Forums/Topic1167710-1550-1.aspx#bm1168100 )

Halaman proyek: http://sqlpsx.codeplex.com/

Keuntungan utama dari pendekatan ini adalah menggabungkan konfigurabilitas / kemampuan penyesuaian menggunakan SMO secara langsung, dengan kenyamanan dan kemudahan pemeliharaan menggunakan alat sederhana yang ada seperti Database Publishing Wizard.

Tao
sumber
1
Saya menghabiskan beberapa waktu untuk mencoba solusi ini, tetapi pada akhirnya saya beralih ke C # dan menggunakan SMO. Masalah yang tidak dapat saya temukan dengan mudah adalah bahwa contoh skrip kode setiap tabel satu per satu. Setelah Anda mulai menambahkan objek 'DRI' (Declarative Referential Integrity) seperti kunci asing, dependensinya tidak akan benar dan / atau akan sangat lambat.
OlduwanSteve
4

Di Alat> Opsi> Desainer> Desainer Tabel dan Database, terdapat opsi untuk 'Buat skrip perubahan secara otomatis' yang akan menghasilkan satu untuk setiap perubahan yang Anda buat pada saat Anda menyimpannya.

John Sheehan
sumber
3
Bukan itu yang saya butuhkan. Saya ingin mendapatkan skrip pembuatan (tujuan akhir saya adalah memasukkan file-file itu secara otomatis ke sistem kendali sumber saya)
Brann
3

Anda dapat melakukannya dengan kode T-SQL menggunakan tabel INFORMATION_SCHEMA.

Ada juga alat pihak ketiga - Saya suka Apex SQL Script tepat untuk penggunaan yang sedang Anda bicarakan. Saya menjalankannya sepenuhnya dari baris perintah.

Cade Roux
sumber
3

Coba alat baris perintah SQL Server baru untuk membuat skrip T-SQL dan memantau Tampilan Manajemen Dinamis.

Bekerja untuk saya seperti pesona. Ini adalah alat berbasis python baru dari Microsoft yang berjalan dari baris perintah. Semuanya bekerja seperti yang dijelaskan di halaman Microsoft (lihat tautan di bawah) Bekerja untuk saya dengan server SQL 2012.

Anda menginstalnya dengan pip:

$ pip instal mssql-scripter

Gambaran umum parameter perintah seperti biasa dengan h untuk bantuan:

mssql-scripter -h

Petunjuk: Jika Anda masuk ke SQL-Server melalui otentikasi Windows, tinggalkan Nama pengguna dan kata sandi.

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

matthhias
sumber
2

Jika Anda menginginkan solusi Microsoft, Anda dapat mencoba: Microsoft SQL Server Database Publishing Wizard 1.1

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

Ini membuat proses batch yang dapat Anda jalankan kapan saja Anda perlu membangun kembali skrip.

Glennular
sumber
1
Sayangnya, itu tidak mendukung SqlServer 2008
Brann
1
Versi 1.2 mengatakan mendukung 2000 dan 2005, tetapi saya baru saja menggunakannya untuk membuat skrip database pada 2008 dengan 3800+ tabel dan berfungsi dengan baik. Itu tidak termasuk opsi kompres, yang tidak diperkenalkan hingga 2008. Saya juga baru saja menguji terhadap database 2008 R2 dan skripnya juga bagus.
Jeremy
2

Saya telah menggunakan DB Comparer - Gratis dan tidak merepotkan skrip seluruh DB dan dapat dibandingkan dengan DB lain dan juga menghasilkan skrip Diff. Sangat baik untuk skrip perubahan Pengembangan ke Produksi. http://www.dbcomparer.com/

MartinC
sumber
1

Ada juga alat baris perintah sederhana yang saya buat untuk kebutuhan saya.
http://mycodepad.wordpress.com/2013/11/18/export-ms-sql-database-schema-with-c/

Itu dapat mengekspor seluruh db, dan mencoba mengekspor objek terenkripsi. Semuanya disimpan dalam folder dan file sql terpisah untuk perbandingan file yang mudah.

Kode juga tersedia di github.

George Kosmidis
sumber
0

Dari Visual Studio 2008 SP1 TeamSuite:

Di tab Server Explorer / Koneksi Data, ada alat terbitkan ke penyedia yang melakukan hal yang sama seperti "Wisaya Penerbitan Basis Data Microsoft SQL Server", tetapi kompatibel dengan MS Sql Server 2008.

Brann
sumber
Bagaimana cara membantu mengotomatiskan tugas?
Serge Wautier
0

Saya menggunakan VS 2012 (untuk DB di MSSQL Server 2008) membandingkan database memiliki pilihan untuk menyimpannya, perbandingan dan pilihan. Ini pada dasarnya adalah apa pengaturan Anda untuk pengiriman. Setelah itu Anda bisa melakukan update atau generate script.

Saya hanya merasa agak canggung untuk memuatnya dari file nanti (seret dan lepas dari windows explorer) karena saya tidak melihat file di explorer solusi.

zhrist
sumber