Làm cách nào để tự động hóa tác vụ “tạo tập lệnh” trong SQL Server Management Studio 2008?


97

Tôi muốn tự động tạo tập lệnh trong SQL Server Management Studio 2008.

Ngay bây giờ những gì tôi làm là:

  • Nhấp chuột phải vào cơ sở dữ liệu của tôi, Nhiệm vụ, "Tạo Tập lệnh ..."
  • chọn thủ công tất cả các tùy chọn xuất tôi cần và nhấn chọn tất cả trên tab "chọn đối tượng"
  • Chọn thư mục xuất
  • Cuối cùng nhấn nút "Hoàn tất"

Có cách nào để tự động hóa tác vụ này không?

Chỉnh sửa: Tôi muốn tạo tập lệnh tạo , không thay đổi tập lệnh.


bạn đã tìm thấy câu trả lời? Tôi cũng muốn làm điều này, tôi đã sử dụng Publishing, nó được lưu trên hard, không biết ở đâu và ở đó tôi không có tất cả các tùy chọn khi tạo script: -?
Alexa Adrian

1
Như đã đề cập trong một số các câu trả lời, Sử dụng SMO nếu bạn là một nhà phát triển
Jay Jay Jay

Câu trả lời:


31

Những gì Brann đang đề cập từ Visual Studio 2008 SP1 Team Suite là phiên bản 1.4 của Trình hướng dẫn xuất bản cơ sở dữ liệu. Nó được cài đặt với sql server 2008 (có thể chỉ chuyên nghiệp?) Cho \ Program Files \ Microsoft SQL Server \ 90 \ Tools \ Publishing \ 1.4. Cuộc gọi VS từ trình thám hiểm máy chủ chỉ đơn giản là gọi điều này. Bạn có thể đạt được chức năng tương tự thông qua dòng lệnh như:

sqlpubwiz help script

Tôi không biết liệu v1.4 có gặp phải những vấn đề tương tự như v1.1 đã làm không (người dùng được chuyển đổi sang vai trò, các ràng buộc không được tạo theo đúng thứ tự), nhưng nó không phải là giải pháp cho tôi vì nó không tập lệnh đối tượng sang các tệp khác nhau như tùy chọn Tasks-> Generate Scripts trong SSMS. Tôi hiện đang sử dụng phiên bản sửa đổi của Scriptio (sử dụng MS SMO API) để hoạt động như một sự thay thế cải tiến cho trình hướng dẫn xuất bản cơ sở dữ liệu (sqlpubwiz.exe). Nó hiện không thể tập lệnh từ dòng lệnh, tôi có thể thêm đóng góp đó trong tương lai.

Scriptio ban đầu được đăng trên blog của Bill Graziano, nhưng sau đó đã được Bill phát hành lên CodePlex và được những người khác cập nhật. Đọc thảo luận để xem cách biên dịch để sử dụng với SQL Server 2008.

http://scriptio.codeplex.com/

CHỈNH SỬA: Tôi đã bắt đầu sử dụng sản phẩm So sánh SQL của RedGate để thực hiện việc này. Đó là một sự thay thế rất tốt cho tất cả những gì thuật sĩ xuất bản sql lẽ ra phải có. Bạn chọn cơ sở dữ liệu, bản sao lưu hoặc ảnh chụp nhanh làm nguồn và một thư mục làm vị trí đầu ra và nó kết hợp mọi thứ độc đáo vào một cấu trúc thư mục. Nó có cùng định dạng mà sản phẩm khác của họ, SQL Source Control, sử dụng.


Có tương đương vào năm 2012 không? Tôi chỉ rất vui nếu trình hướng dẫn nhớ các cài đặt của tôi như "Chỉ mục tập lệnh".
PeterX

6
@PeterX SMS> Tools> Options> SQL Server Object Explorer> Scripting
zanlok

1
Đối với năm 2012, hãy làm theo hướng dẫn này: simple-talk.com/sql/database-administration/…
Simon Hutchison.

@zanlok bình luận rất hữu ích. Rất tiếc, họ đang thiếu tùy chọn "Bao gồm các câu lệnh không được hỗ trợ" trong SQL Server 2014.
jk7 16/11/16

42

SqlPubwiz có các tùy chọn rất hạn chế so với việc tạo tập lệnh trong SSMS. Ngược lại, các tùy chọn có sẵn với SMO gần như khớp chính xác với các tùy chọn trong SSMS, cho thấy nó có thể là cùng một mã. (Tôi hy vọng MS không viết nó hai lần!) Có một số ví dụ trên MSDN như ví dụ này hiển thị các bảng kịch bản dưới dạng các đối tượng riêng lẻ. Tuy nhiên, nếu bạn muốn mọi thứ hoạt động chính xác với lược đồ 'đầy đủ' bao gồm các đối tượng 'DRI' (Tính toàn vẹn tham chiếu khai báo) như các khóa ngoại thì các bảng viết kịch bản riêng lẻ sẽ không hoạt động chính xác các phần phụ thuộc. Tôi thấy việc thu thập tất cả các URN và giao chúng cho tập lệnh dưới dạng một mảng là điều cần thiết. Mã này, được sửa đổi từ ví dụ,

    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
Bạn có thể xem lớp Microsoft.SqlServer.Management.SqlScriptPublish.ScriptPublishWizardtừ tập hợp C: \ Program Files (x86) \ Microsoft SQL Server \ 110 \ Tools \ Binn \ ManagementStudio \ Microsoft.SqlServer.Management.SqlScriptPublishUI.dll. Đây là những gì SSMS sử dụng. (Ngoài ra, bạn có thể xem lớp Microsoft.SqlServer.Management.UI.GenerateScripttừ assembly C: \ Program Files (x86) \ Microsoft SQL Server \ 110 \ Tools \ Binn \ ManagementStudio \ ReplicationDialog.dll.)
cubetwo1729 22/1113

Mã ví dụ và các liên kết ở đây là một khởi đầu tuyệt vời và phải là câu trả lời đầy đủ nhất cho OP (đó cũng là câu hỏi chính xác của tôi).
zanlok

1
Tôi đã hack cùng một ứng dụng C # cho phép bạn tạo các tập lệnh máy chủ SQL từ dòng lệnh trong Linux. Tất cả bạn cần là Net Core 2 preview: github.com/mkurz/SQLServerScripter
mkurz

20

Tôi đã viết một tiện ích dòng lệnh mã nguồn mở có tên là SchemaZen để thực hiện điều này. Nó nhanh hơn nhiều so với viết kịch bản từ studio quản lý và đầu ra của nó thân thiện với kiểm soát phiên bản hơn. Nó hỗ trợ kịch bản cả lược đồ và dữ liệu.

Để tạo tập lệnh, hãy chạy:

tập lệnh schemazen.exe - máy chủ localhost --database db --scriptDir c: \ somedir

Sau đó, để tạo lại cơ sở dữ liệu từ các tập lệnh, hãy chạy:

schemazen.exe tạo --server localhost --database db --scriptDir c: \ somedir

Tôi vừa dùng thử SchemaZen và tôi thực sự ấn tượng. Làm việc lần đầu tiên. Cảm ơn Seth!
Simon Hughes

@Seth vậy bạn đang sử dụng cái gì để viết kịch bản cho các đối tượng? Tôi không thấy một tham chiếu nào đến bất kỳ Microsoft.SqlServer nào (cũng có một câu lệnh sử dụng không được sử dụng).
John

@John - Schema Zen chứa thư viện riêng để tạo script. Nó đọc lược đồ thành một mô hình sau đó tạo các tập lệnh dựa trên mô hình đó. Xem github.com/sethreno/schemazen/blob/master/model/Models/… để biết ví dụ đơn giản.
Seth Reno


7

Nếu bạn là một nhà phát triển, hãy chắc chắn sử dụng SMO. Đây là một liên kết đến lớp Scripter, là điểm khởi đầu của bạn:

Lớp Scripter


7

Tôi không thấy powershell với SQLPSX được đề cập trong bất kỳ câu trả lời nào trong số này ... Cá nhân tôi chưa chơi với nó nhưng nó trông rất đơn giản để sử dụng và phù hợp lý tưởng với loại tác vụ tự động hóa này, với các tác vụ như:

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

(tham khảo: http://www.sqlservercentral.com/Forums/Topic1167710-1550-1.aspx#bm1168100 )

Trang dự án: http://sqlpsx.codeplex.com/

Ưu điểm chính của phương pháp này là nó kết hợp khả năng cấu hình / khả năng tùy chỉnh của việc sử dụng trực tiếp SMO, với sự tiện lợi và khả năng bảo trì của việc sử dụng một công cụ hiện có đơn giản như Database Publishing Wizard.


1
Tôi đã dành một thời gian để thử giải pháp này, nhưng cuối cùng tôi đã chuyển sang C # và sử dụng SMO. Vấn đề mà tôi không thể dễ dàng tìm ra cách vượt qua là mã ví dụ viết từng bảng riêng lẻ. Một khi bạn bắt đầu thêm vào các đối tượng 'DRI' (Tính toàn vẹn tham chiếu khai báo) như khóa ngoại, nó sẽ không nhận được đúng các phần phụ thuộc và / hoặc nó sẽ rất chậm.
OlduwanSteve

4

Trong Công cụ> Tùy chọn> Nhà thiết kế> Nhà thiết kế Bảng và Cơ sở dữ liệu, có một tùy chọn cho 'Tự động tạo các tập lệnh thay đổi' sẽ tạo một tùy chọn cho mọi thay đổi bạn thực hiện tại thời điểm bạn lưu nó.


3
Đó không chính xác là những gì tôi cần. Tôi muốn nhận các tập lệnh tạo (mục tiêu cuối cùng của tôi là tự động kiểm tra các tệp đó vào hệ thống kiểm soát nguồn của tôi)
Brann

3

Bạn có thể làm điều đó với mã T-SQL bằng cách sử dụng các bảng INFORMATION_SCHEMA.

Ngoài ra còn có các công cụ của bên thứ ba - Tôi thích Apex SQL Script vì chính xác cách sử dụng mà bạn đang đề cập. Tôi chạy nó hoàn toàn từ dòng lệnh.


3

Thử các công cụ dòng lệnh SQL Server mới để tạo các tập lệnh T-SQL và theo dõi Chế độ xem quản lý động.

Làm việc cho tôi như một cái duyên. Đây là một công cụ dựa trên python mới của Microsoft chạy từ dòng lệnh. Mọi thứ hoạt động như được mô tả trên trang Microsoft (xem liên kết bên dưới) Phù hợp với tôi với máy chủ SQL 2012.

Bạn cài đặt nó bằng pip:

$ pip cài đặt mssql-scripter

Tổng quan tham số lệnh như bình thường với h để được trợ giúp:

mssql-scripter -h

Gợi ý: Nếu bạn đăng nhập vào SQL-Server thông qua xác thực Windows, chỉ cần bỏ tên người dùng và mật khẩu.

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


2

Nếu bạn muốn một giải pháp của Microsoft, bạn có thể thử: Microsoft SQL Server Database Publishing Wizard 1.1

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

Nó tạo ra một quy trình hàng loạt mà bạn có thể chạy bất cứ lúc nào bạn cần để xây dựng lại các tập lệnh.


1
Thật không may, nó không hỗ trợ SqlServer 2008
Brann

1
Phiên bản 1.2 cho biết nó hỗ trợ 2000 và 2005, nhưng tôi chỉ sử dụng nó để tập lệnh cho cơ sở dữ liệu trên 2008 với hơn 3800 bảng và nó hoạt động tốt. Nó không bao gồm các tùy chọn nén, nó đã không được giới thiệu cho đến năm 2008. Tôi cũng vừa thử nghiệm với cơ sở dữ liệu R2 2008 và các tập lệnh của nó cũng tốt.
Jeremy

2

Tôi đã sử dụng DB Comparer - Toàn bộ DB miễn phí và không có tập lệnh phức tạp và có thể so sánh với một DB khác và cũng tạo ra một tập lệnh Diff. Tuyệt vời cho các kịch bản thay đổi từ Phát triển đến Sản xuất. http://www.dbcomparer.com/



0

Từ Visual Studio 2008 SP1 TeamSuite:

Trong tab Server Explorer / Data Connections, có một công cụ xuất bản tới nhà cung cấp, công cụ này giống như "Microsoft SQL Server Database Publishing Wizard", nhưng tương thích với MS Sql Server 2008.


Nó giúp tự động hóa nhiệm vụ như thế nào?
Serge Wautier

0

Tôi đang sử dụng VS 2012 (cho DB trên MSSQL Server 2008) so sánh cơ sở dữ liệu có một tùy chọn để lưu nó, so sánh và các tùy chọn. Về cơ bản, đây là những gì bạn cài đặt để phân phối. Sau đó, bạn có thể cập nhật hoặc tạo tập lệnh.

Tôi chỉ thấy hơi khó xử khi tải nó từ tệp sau đó (kéo và thả từ windows explorer) vì tôi không thấy tệp trong trình khám phá giải pháp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.