SQL Server Management Studio 2008'de "betik oluşturma" görevini nasıl otomatikleştirebilirim?


98

SQL Server Management Studio 2008'de komut dosyası oluşturmayı otomatikleştirmek istiyorum.

Şu anda yaptığım şey:

  • Veritabanıma sağ tıklayın, Görevler, "Komut Dosyaları Oluştur ..."
  • İhtiyacım olan tüm dışa aktarma seçeneklerini manuel olarak seçin ve "nesne seç" sekmesinde tümünü seç'e basın
  • Dışa aktarma klasörünü seçin
  • Sonunda "Bitir" düğmesine basın

Bu görevi otomatikleştirmenin bir yolu var mı?

Düzenleme: Oluşturma komut dosyaları oluşturmak istiyorum, komut dosyalarını değiştirmek değil.


cevabı buldun mu Bunu ben de yapmak istiyorum, Yayımlamayı kullandım, çok fazla kaydetti, nerede ve orada bilmiyorum bir komut dosyası oluştururken tüm seçeneklere sahip değilim: -?
Alexa Adrian

1
Cevapların birçoğunda belirtildiği gibi, geliştiriciyseniz SMO kullanın
Jay Jay Jay

Yanıtlar:


31

Brann'ın Visual Studio 2008 SP1 Team Suite'te bahsettiği, Veritabanı Yayınlama Sihirbazı'nın 1.4 sürümüdür. Sql server 2008 ile birlikte (belki sadece profesyonel mi?) \ Program Files \ Microsoft SQL Server \ 90 \ Tools \ Publishing \ 1.4'e kurulur. Sunucu gezgininden VS çağrısı basitçe bunu çağırıyor. Aşağıdaki gibi komut satırı aracılığıyla aynı işlevi elde edebilirsiniz:

sqlpubwiz help script

V1.4'ün v1.1 ile aynı sorunları yaşayıp yaşamadığını bilmiyorum (kullanıcılar rollere dönüştürülüyor, kısıtlamalar doğru sırada oluşturulmuyor), ancak benim için bir çözüm değil çünkü nesnelerin komut dosyası değil SSMS'deki Görevler-> Komut Dosyaları Oluştur seçeneği gibi farklı dosyalara. Şu anda, veritabanı yayınlama sihirbazının (sqlpubwiz.exe) geliştirilmiş bir alternatifi olarak hareket etmek için Scriptio'nun değiştirilmiş bir sürümünü (MS SMO API'sini kullanır) kullanıyorum. Şu anda komut satırından komut dosyası oluşturulamıyor, gelecekte bu katkıyı ekleyebilirim.

Scriptio ilk olarak Bill Graziano'nun blogunda yayınlandı, ancak daha sonra Bill tarafından CodePlex'te yayınlandı ve başkaları tarafından güncellendi. SQL Server 2008 ile kullanmak üzere nasıl derleneceğini görmek için tartışmayı okuyun.

http://scriptio.codeplex.com/

DÜZENLEME: Bunu yapmak için RedGate'in SQL Karşılaştırma ürününü kullanmaya başladığımdan beri. Tüm o sql yayınlama sihirbazının yerine geçmesi çok güzel. Kaynak olarak bir veritabanı, yedekleme veya anlık görüntü ve çıktı konumu olarak bir klasör seçersiniz ve her şeyi güzel bir şekilde bir klasör yapısına aktarır. Diğer ürünleri olan SQL Source Control'ün kullandığı formatla aynı olur.


2012'de bir eşdeğeri var mı? Sihirbaz, "Komut Dosyası Dizinleri" gibi ayarlarımı hatırlasa mutlu olurum.
PeterX

6
@PeterX SMSS> Araçlar> Seçenekler> SQL Server Nesne Gezgini> Komut Dosyası
zanlok


@zanlok çok faydalı yorum. Maalesef SQL Server 2014'te "Desteklenmeyen ifadeleri dahil et" seçeneği eksik.
jk7

42

SqlPubwiz, SSMS'deki komut dosyası oluşturmaya kıyasla çok sınırlı seçeneklere sahiptir. Aksine, SMO ile mevcut olan seçenekler neredeyse tamamen SSMS'dekilerle aynıdır, bu da muhtemelen aynı kod olduğunu gösterir. (MS iki kez yazmadım umut ediyorum!) Gibi MSDN üzerinde birkaç örneği vardır bu bir bireysel nesneler olarak betik tablolarını göstermektedir. Bununla birlikte, yabancı anahtarlar gibi 'DRI' (Bildirime Dayalı Referans Bütünlüğü) nesnelerini içeren 'tam' bir şema ile her şeyin doğru bir şekilde komut dosyası oluşturmasını istiyorsanız, tabloları ayrı ayrı komut dosyası oluşturmak bağımlılıkları doğru şekilde çalışmaz. Tüm URN'leri toplamanın ve onları bir dizi olarak betikleyiciye vermenin gerekli olduğunu anladım. Örnekten değiştirilen bu kod,

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

10
Microsoft.SqlServer.Management.SqlScriptPublish.ScriptPublishWizardC: \ Program Files (x86) \ Microsoft SQL Server \ 110 \ Tools \ Binn \ ManagementStudio \ Microsoft.SqlServer.Management.SqlScriptPublishUI.dll derlemesinden sınıfa bakabilirsiniz . SSMS'nin kullandığı şey budur. (Alternatif olarak, Microsoft.SqlServer.Management.UI.GenerateScriptC: \ Program Files (x86) \ Microsoft SQL Server \ 110 \ Tools \ Binn \ ManagementStudio \ ReplicationDialog.dll
derlemesinden sınıfa bakabilirsiniz

Buradaki örnek kod ve bağlantılar harika bir başlangıçtı ve OP'nin en eksiksiz yanıtı olmalı (benim de aynen sorum buydu).
zanlok

1
Linux'ta komut satırından SQL sunucu betikleri oluşturmanıza izin veren bir C # uygulamasını birlikte hackledim. Tek ihtiyacınız olan .Net Core 2 önizlemesidir: github.com/mkurz/SQLServerScripter
mkurz

20

Bunu yapan SchemaZen adında açık kaynaklı bir komut satırı yardımcı programı yazdım . Yönetim stüdyosundan komut dosyası yazmaktan çok daha hızlıdır ve çıktısı daha fazla sürüm kontrolü dostudur. Hem şema hem de veri komut dosyası oluşturmayı destekler.

Komut dosyaları oluşturmak için şunu çalıştırın:

schemazen.exe komut dosyası --server localhost --database db --scriptDir c: \ somedir

Ardından veritabanını komut dosyalarından yeniden oluşturmak için şunu çalıştırın:

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

SchemaZen'i yeni denedim ve gerçekten etkilendim. İlk kez çalıştı. Teşekkürler Seth!
Simon Hughes

@Seth, nesneleri betiklemek için ne kullanıyorsunuz? Herhangi bir Microsoft.SqlServer herhangi bir şeye tek bir referans görmedim (pek de kullanılmayan tek bir kullanım ifadesi vardı).
John

@John - Schema Zen, komut dosyası oluşturmak için kendi kitaplığını içerir. Şemayı bir modele okur ve ardından modele göre komut dosyalarını oluşturur. Basit bir örnek için github.com/sethreno/schemazen/blob/master/model/Models/… adresine bakın .
Seth Reno



7

SQLPSX ile powershell'in bu cevapların hiçbirinde bahsettiğini görmüyorum ... Şahsen onunla oynamadım, ancak kullanımı güzel bir şekilde basit görünüyor ve aşağıdaki gibi görevlerle bu tür otomasyon görevleri için ideal olarak uygun görünüyor:

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 )

Proje sayfası: http://sqlpsx.codeplex.com/

Bu yaklaşımın ana avantajı, SMO'yu doğrudan kullanmanın yapılandırılabilirliğini / özelleştirilebilirliğini Veritabanı Yayınlama Sihirbazı gibi basit bir mevcut aracı kullanmanın rahatlığı ve sürdürülebilirliği ile birleştirmesidir.


1
Bu çözümü denemek için bir süre harcadım, ancak sonunda C # ve SMO'yu kullanmaya döndüm. Kolayca geçmenin bir yolunu bulamadığım sorun, örnek kodun her tabloyu ayrı ayrı betimlemesi. Yabancı anahtarlar gibi 'DRI' (Bildirime Dayalı Referans Bütünlüğü) nesnelerini eklemeye başladığınızda, bağımlılıkları doğru hale getirmeyecek ve / veya çok yavaş olacaktır.
OlduwanSteve

4

Araçlar> Seçenekler> Tasarımcılar> Tablo ve Veritabanı Tasarımcıları'nda, kaydettiğiniz her değişiklik için bir tane oluşturacak 'Değişiklik komut dosyalarını otomatik oluştur' seçeneği vardır.


3
Tam olarak ihtiyacım olan şey bu değil. Oluşturma komut dosyalarını almak istiyorum (son hedefim bu dosyaları otomatik olarak kaynak kontrol sistemime iade etmek)
Brann

3

INFORMATION_SCHEMA tablolarını kullanarak T-SQL kodu ile yapabilirsiniz.

Üçüncü taraf araçlar da var - Apex SQL Script'i tam olarak bahsettiğiniz kullanım için seviyorum. Tamamen komut satırından çalıştırıyorum.


3

Bir Microsoft çözümü istiyorsanız şunları deneyebilirsiniz: Microsoft SQL Server Veritabanı Yayınlama Sihirbazı 1.1

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

Komut dosyalarını yeniden oluşturmanız gerektiğinde çalıştırabileceğiniz bir toplu işlem oluşturur.


1
Ne yazık ki, SqlServer 2008 desteklemez
Brann

1
Sürüm 1.2, 2000 ve 2005'i desteklediğini söylüyor, ancak bunu 2008'de 3800+ tabloyla bir veritabanı komut dosyası oluşturmak için kullandım ve iyi çalıştı. 2008 yılına kadar kullanılmayan sıkıştırma seçeneklerini içermiyordu. Ayrıca 2008 R2 veri tabanına karşı test ettim ve o da iyi bir komut dosyası oluşturuyor.
Jeremy

3

T-SQL komut dosyaları oluşturmak ve Dinamik Yönetim Görünümlerini izlemek için yeni SQL Server komut satırı araçlarını deneyin .

Benim için cazibe gibi çalıştı. Microsoft'un komut satırından çalışan python tabanlı yeni bir aracıdır. Her şey Microsoft sayfasında anlatıldığı gibi çalışır (aşağıdaki bağlantıya bakın) Benim için SQL 2012 sunucusu ile çalıştı.

Pip ile kurarsınız:

$ pip mssql-scripter'ı yükle

Yardım için h ile her zamanki gibi komut parametresine genel bakış:

mssql-komut dosyası -h

İpucu: Windows kimlik doğrulaması aracılığıyla SQL-Server'da oturum açarsanız, Kullanıcı adı ve parolayı bırakmanız yeterlidir.

https://cloudblogs.microsoft.com/sqlserver/2017/05/17/try-new-sql-server-command-line-tools-to-generate-t-sql-scripts-and-monitor-dynamic-management- Görüntüleme/


2

DB Comparer'ı kullanıyorum - Ücretsizdir ve tüm DB'nin sorunsuz betiği yoktur ve başka bir DB ile karşılaştırabilir ve ayrıca bir Diff betiği üretebilir. Geliştirmeden Üretime değişiklik komut dosyaları için mükemmel. http://www.dbcomparer.com/



0

Visual Studio 2008 SP1 TeamSuite'ten:

Sunucu Gezgini / Veri Bağlantıları sekmesinde, "Microsoft SQL Server Veritabanı Yayınlama Sihirbazı" ile aynı şeyi yapan, ancak MS Sql Server 2008 ile uyumlu olan bir sağlayıcıya yayınlama aracı vardır.


Görevin otomatikleştirilmesine nasıl yardımcı olur?
Serge Wautier

0

VS 2012 kullanıyorum (MSSQL Server 2008 üzerindeki DB'ler için) karşılaştırma veritabanını kaydetme seçeneği, karşılaştırma ve seçenekler var. Bu, esasen teslimat ayarlarınızdır. Bundan sonra komut dosyasını güncelleyebilir veya oluşturabilirsiniz.

Dosyayı çözüm gezgininde görmediğim için daha sonra dosyadan yüklemeyi biraz garip buluyorum (Windows gezgininden sürükle ve bırak).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.