ฉันจะทำให้งาน“ สร้างสคริปต์” เป็นอัตโนมัติใน SQL Server Management Studio 2008 ได้อย่างไร


98

ฉันต้องการสร้างสคริปต์โดยอัตโนมัติใน SQL Server Management Studio 2008

ตอนนี้สิ่งที่ฉันทำคือ:

  • คลิกขวาที่ฐานข้อมูลของฉัน Tasks "Generate Scripts ... "
  • เลือกตัวเลือกการส่งออกทั้งหมดที่ฉันต้องการด้วยตนเองและกดเลือกทั้งหมดบนแท็บ "เลือกวัตถุ"
  • เลือกโฟลเดอร์ส่งออก
  • ในที่สุดก็กดปุ่ม "เสร็จสิ้น"

มีวิธีทำให้งานนี้เป็นไปโดยอัตโนมัติหรือไม่?

แก้ไข: ฉันต้องการสร้างสคริปต์การสร้างไม่ใช่เปลี่ยนสคริปต์


คุณพบคำตอบหรือไม่? ฉันต้องการทำสิ่งนี้เช่นกันฉันใช้การเผยแพร่มันบันทึกไว้อย่างยากลำบากไม่รู้ว่าอยู่ที่ไหนและที่นั่นฉันไม่มีตัวเลือกทั้งหมดที่เป็นเมื่อสร้างสคริปต์: -?
Alexa Adrian

1
ดังที่ได้กล่าวไว้ในคำตอบหลายข้อใช้ SMO หากคุณเป็นนักพัฒนา
Jay Jay Jay

คำตอบ:


31

สิ่งที่ Brann กล่าวถึงจาก Visual Studio 2008 SP1 Team Suite คือเวอร์ชัน 1.4 ของตัวช่วยสร้างการเผยแพร่ฐานข้อมูล ติดตั้งกับ sql server 2008 (อาจเป็นเฉพาะมืออาชีพ?) ไปยัง \ Program Files \ Microsoft SQL Server \ 90 \ Tools \ Publishing \ 1.4 การโทร VS จากเซิร์ฟเวอร์ explorer เรียกแบบนี้ คุณสามารถใช้งานฟังก์ชันเดียวกันผ่านทางบรรทัดคำสั่งเช่น:

sqlpubwiz help script

ฉันไม่รู้ว่า v1.4 มีปัญหาเดียวกันกับที่ v1.1 ทำหรือไม่ (ผู้ใช้ถูกแปลงเป็นบทบาทข้อ จำกัด ไม่ได้ถูกสร้างขึ้นตามลำดับที่ถูกต้อง) แต่มันไม่ใช่วิธีแก้ปัญหาสำหรับฉันเพราะมันไม่มีสคริปต์อ็อบเจ็กต์ ไปยังไฟล์ต่างๆเช่นตัวเลือก Tasks-> Generate Scripts ใน SSMS ฉันกำลังใช้ Scriptio เวอร์ชันแก้ไข (ใช้ MS SMO API) เพื่อทำหน้าที่แทนตัวช่วยสร้างการเผยแพร่ฐานข้อมูลที่ได้รับการปรับปรุง (sqlpubwiz.exe) ขณะนี้ยังไม่สามารถเขียนสคริปต์ได้จากบรรทัดคำสั่งฉันอาจเพิ่มการมีส่วนร่วมนั้นในอนาคต

Scriptio ถูกโพสต์ในบล็อกของ Bill Graziano แต่ต่อมาได้เผยแพร่ไปยัง CodePlex โดย Bill และได้รับการอัปเดตโดยผู้อื่น อ่านการอภิปรายเพื่อดูวิธีการคอมไพล์เพื่อใช้กับ SQL Server 2008

http://scriptio.codeplex.com/

แก้ไข: ฉันเริ่มใช้ผลิตภัณฑ์ SQL Compare ของ RedGate เพื่อทำสิ่งนี้ เป็นการทดแทนที่ดีมากสำหรับวิซาร์ดการเผยแพร่ sql ทั้งหมดที่ควรจะเป็น คุณเลือกฐานข้อมูลการสำรองข้อมูลหรือสแน็ปช็อตเป็นแหล่งที่มาและโฟลเดอร์เป็นตำแหน่งเอาต์พุตและทิ้งทุกอย่างลงในโครงสร้างโฟลเดอร์ มันเป็นรูปแบบเดียวกับที่ผลิตภัณฑ์อื่น ๆ ของตนคือ SQL Source Control ใช้


มีเทียบเท่าในปี 2555 หรือไม่? ฉันจะยินดีถ้าวิซาร์ดจำการตั้งค่าของฉันเช่น "ดัชนีสคริปต์" ได้
PeterX

6
@PeterX SMSS> เครื่องมือ> ตัวเลือก> SQL Server Object Explorer> Scripting
zanlok

1
สำหรับปี 2555 ให้ปฏิบัติตามคู่มือนี้: simple-talk.com/sql/database-administration/…
Simon Hutchison

@zanlok ความคิดเห็นที่มีประโยชน์มาก น่าเสียดายที่ไม่มีตัวเลือก "รวมคำสั่งที่ไม่สนับสนุน" ใน SQL Server 2014
jk7

42

SqlPubwiz มีตัวเลือกที่ จำกัด มากเมื่อเทียบกับการสร้างสคริปต์ใน SSMS ในทางตรงกันข้ามตัวเลือกที่มีให้กับSMO นั้นแทบจะตรงกับตัวเลือกใน SSMS ซึ่งบอกว่าอาจเป็นรหัสเดียวกัน (ฉันหวังว่า MS จะไม่เขียนซ้ำสองครั้ง!) มีหลายตัวอย่างใน MSDN เช่นนี้ที่แสดงตารางสคริปต์เป็นวัตถุแต่ละชิ้น อย่างไรก็ตามหากคุณต้องการให้ทุกอย่างเขียนสคริปต์ได้อย่างถูกต้องด้วยสคีมา 'เต็ม' ที่มีวัตถุ 'DRI' (Declarative Referential Integrity) เช่นคีย์ต่างประเทศตารางการเขียนสคริปต์ทีละรายการจะไม่ทำงานการอ้างอิงอย่างถูกต้อง ฉันพบว่าจำเป็นอย่างยิ่งที่จะต้องรวบรวม URN ทั้งหมดและส่งให้กับ scripter เป็นอาร์เรย์ โค้ดนี้แก้ไขจากตัวอย่าง

    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.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

1
ฉันแฮ็คแอป C # เข้าด้วยกันซึ่งช่วยให้คุณสร้างสคริปต์เซิร์ฟเวอร์ SQL จากบรรทัดคำสั่งใน Linux สิ่งที่คุณต้องมีคือพรีวิว. Net Core 2: github.com/mkurz/SQLServerScripter
mkurz

20

ฉันเขียนยูทิลิตี้บรรทัดคำสั่งโอเพนซอร์สชื่อSchemaZenที่ทำสิ่งนี้ เร็วกว่าการเขียนสคริปต์จากสตูดิโอการจัดการมากและเอาต์พุตนั้นควบคุมเวอร์ชันได้ง่ายกว่า รองรับการเขียนสคริปต์ทั้งสคีมาและข้อมูล

ในการสร้างสคริปต์ให้รัน:

สคริปต์ schemazen.exe - เซิร์ฟเวอร์ localhost - ฐานข้อมูล db --scriptDir c: \ somedir

จากนั้นเพื่อสร้างฐานข้อมูลใหม่จากการรันสคริปต์:

schemazen.exe สร้าง - เซิร์ฟเวอร์ localhost - ฐานข้อมูล db --scriptDir c: \ somedir

ฉันเพิ่งลองใช้ SchemaZen และฉันประทับใจมาก ทำงานครั้งแรก ขอบคุณ Seth!
Simon Hughes

@Seth แล้วคุณใช้สคริปต์วัตถุอะไร? ฉันไม่เห็นการอ้างอิงถึง Microsoft.SqlServer ใด ๆ เลยแม้แต่คำเดียว (มีคำสั่งเดียวที่ไม่ได้ใช้)
John

@ จอห์น - Schema Zen มีไลบรารีของตัวเองสำหรับการเขียนสคริปต์ มันอ่านสคีมาเป็นโมเดลจากนั้นสร้างสคริปต์ตามโมเดล ดูตัวอย่างง่ายๆที่github.com/sethreno/schemazen/blob/master/model/Models/…
Seth Reno

12

คุณสามารถใช้ SQL Server Management Object (SMO) เพื่อทำให้งานการจัดการ SQL Server 2005 เป็นไปโดยอัตโนมัติรวมถึงการสร้างสคริปต์: http://msdn.microsoft.com/en-us/library/ms162169.aspx


8

หากคุณเป็นนักพัฒนาซอฟต์แวร์ให้ไปกับ SMO นี่คือลิงค์ไปยังคลาส Scripter ซึ่งเป็นจุดเริ่มต้นของคุณ:

คลาส Scripter


7

ฉันไม่เห็น powershell กับ SQLPSX ที่กล่าวถึงในคำตอบใด ๆ เหล่านี้ ... โดยส่วนตัวแล้วฉันไม่ได้เล่นด้วย แต่มันดูสวยงามใช้งานง่ายและเหมาะอย่างยิ่งกับงานอัตโนมัติประเภทนี้ด้วยงานเช่น:

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/

ข้อได้เปรียบหลักของแนวทางนี้คือการรวม configurablity / customizability ของการใช้ SMO โดยตรงเข้ากับความสะดวกและความสามารถในการบำรุงรักษาโดยใช้เครื่องมือที่มีอยู่ทั่วไปเช่น Database Publishing Wizard


1
ฉันใช้เวลาสักพักหนึ่งในการลองใช้วิธีแก้ปัญหานี้ แต่ในที่สุดฉันก็หันมาใช้ C # และใช้ SMO ปัญหาที่ฉันไม่สามารถหาทางผ่านได้ง่ายๆคือโค้ดตัวอย่างสคริปต์แต่ละตารางแยกกัน เมื่อคุณเริ่มเพิ่มวัตถุ 'DRI' (Declarative Referential Integrity) เช่นคีย์ต่างประเทศมันจะไม่ได้รับการอ้างอิงที่ถูกต้องและ / หรือมันจะช้ามาก
OlduwanSteve

4

ในเครื่องมือ> ตัวเลือก> นักออกแบบ> นักออกแบบตารางและฐานข้อมูลมีตัวเลือกสำหรับ 'สร้างสคริปต์การเปลี่ยนแปลงอัตโนมัติ' ที่จะสร้างหนึ่งรายการสำหรับการเปลี่ยนแปลงทุกครั้งที่คุณทำในเวลาที่คุณบันทึก


3
นั่นไม่ใช่สิ่งที่ฉันต้องการ ฉันต้องการรับสคริปต์การสร้าง (เป้าหมายสุดท้ายของฉันคือการตรวจสอบไฟล์เหล่านั้นโดยอัตโนมัติในระบบควบคุมแหล่งที่มาของฉัน)
Brann

3

คุณสามารถทำได้ด้วยรหัส T-SQL โดยใช้ตาราง INFORMATION_SCHEMA

นอกจากนี้ยังมีเครื่องมือของบุคคลที่สาม - ฉันชอบ Apex SQL Script สำหรับการใช้งานที่คุณกำลังพูดถึงอย่างแม่นยำ ฉันเรียกใช้โดยสมบูรณ์จากบรรทัดคำสั่ง


3

หากคุณต้องการใช้โซลูชันของ Microsoft คุณสามารถลอง: Microsoft SQL Server Database Publishing Wizard 1.1

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

สร้างกระบวนการแบตช์ที่คุณสามารถเรียกใช้เมื่อใดก็ได้ที่คุณต้องการสร้างสคริปต์ใหม่


1
น่าเสียดายที่ไม่รองรับ SqlServer 2008
Brann

1
เวอร์ชัน 1.2 กล่าวว่ารองรับปี 2000 และ 2005 แต่ฉันเพิ่งใช้เพื่อเขียนสคริปต์ฐานข้อมูลในปี 2008 ที่มีตาราง 3800+ ตารางและทำงานได้ดี มันไม่ได้รวมตัวเลือกการบีบอัดซึ่งไม่ได้เปิดตัวจนถึงปี 2008 ฉันเพิ่งทดสอบกับฐานข้อมูล 2008 R2 และสคริปต์ก็ใช้ได้เช่นกัน
Jeremy

3

ลองใช้เครื่องมือบรรทัดคำสั่ง SQL Server ใหม่เพื่อสร้างสคริปต์ T-SQLและตรวจสอบมุมมองการจัดการแบบไดนามิก

ทำงานให้ฉันเหมือนมีเสน่ห์ เป็นเครื่องมือที่ใช้ python ใหม่จาก Microsoft ที่ทำงานจากบรรทัดคำสั่ง ทุกอย่างทำงานเหมือนที่อธิบายไว้ในหน้า Microsoft (ดูลิงค์ด้านล่าง) ทำงานให้ฉันด้วยเซิร์ฟเวอร์ SQL 2012

คุณติดตั้งด้วย pip:

$ pip ติดตั้ง mssql-scripter

ภาพรวมพารามิเตอร์คำสั่งตามปกติด้วย h สำหรับความช่วยเหลือ:

mssql-scripter -h

คำแนะนำ: หากคุณล็อกอินเข้าสู่ SQL-Server ผ่านการรับรองความถูกต้องของ Windows เพียงแค่ทิ้งชื่อผู้ใช้และรหัสผ่าน

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

ฉันใช้ 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:

ในแท็บ Server Explorer / Data Connections มีเครื่องมือเผยแพร่ไปยังผู้ให้บริการซึ่งทำเช่นเดียวกับ "Microsoft SQL Server Database Publishing Wizard" แต่เข้ากันได้กับ MS Sql Server 2008


มันช่วยให้งานอัตโนมัติได้อย่างไร?
Serge Wautier

0

ฉันใช้ VS 2012 (สำหรับฐานข้อมูลบน MSSQL Server 2008) เปรียบเทียบฐานข้อมูลมีตัวเลือกในการบันทึกการเปรียบเทียบและตัวเลือก นี่คือการตั้งค่าสำหรับการจัดส่งของคุณเป็นหลัก หลังจากนั้นคุณสามารถอัปเดตหรือสร้างสคริปต์ได้

ฉันพบว่ามันค่อนข้างอึดอัดที่จะโหลดจากไฟล์ในภายหลัง (ลากและวางจาก windows explorer) เนื่องจากฉันไม่เห็นไฟล์ในโซลูชัน explorer

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.