Як я можу автоматизувати завдання "генерувати сценарії" в SQL Server Management Studio 2008?


97

Я хотів би автоматизувати генерацію сценаріїв у SQL Server Management Studio 2008.

Зараз те, що я роблю, це:

  • Клацніть правою кнопкою миші на моїй базі даних, Завдання, "Створити сценарії ..."
  • вручну виберіть усі необхідні варіанти експорту, а потім натисніть кнопку "Вибрати всі" на вкладці "Вибрати об'єкт"
  • Виберіть папку експорту
  • Врешті натисніть кнопку "Готово"

Чи є спосіб автоматизувати це завдання?

Редагувати: Я хочу створювати сценарії створення , а не змінювати сценарії.


ти знайшов відповідь? Я теж хочу це зробити, я використав Publishing, він економив на жорсткому рівні, не знаю, де і там я не маю всіх варіантів, які є при створенні сценарію: -?
Алекса Адріан

1
Як уже згадувалося в кількох відповідях, використовуйте SMO, якщо ви розробник
Jay Jay Jay

Відповіді:


31

Що Бранн згадує у програмі Visual Studio 2008 SP1 Team Suite - це версія 1.4 Майстра публікації баз даних. Він встановлений на сервері sql 2008 (можливо, лише професійно?) До \ Program Files \ Microsoft SQL Server \ 90 \ Tools \ Publishing \ 1.4. Виклик VS від провідника сервера просто викликає це. Ви можете досягти тієї ж функціональності за допомогою командного рядка, як:

sqlpubwiz help script

Я не знаю, чи має v1.4 ті ж проблеми, що і v1.1 (користувачі перетворюються на ролі, обмеження створюються не в правильному порядку), але це не є рішенням для мене, тому що не має об'єктів сценарію для різних файлів, таких як Завдання-> Створення скриптів у SSMS. В даний час я використовую модифіковану версію Scriptio (використовує MS SMO API), щоб діяти як вдосконалена заміна майстра публікації баз даних (sqlpubwiz.exe). Наразі це неможливо прописати з командного рядка, я можу додати цей внесок у майбутньому.

Скриптіо спочатку був розміщений у блозі Білла Граціано, але згодом був виданий Біллом CodePlex та оновлений іншими. Прочитайте дискусію, щоб дізнатися, як компілювати для використання з SQL Server 2008.

http://scriptio.codeplex.com/

EDIT: З цього часу я почав використовувати продукт RedGate для порівняння SQL для цього. Це дуже приємна заміна для всього, що мав би бути майстер публікації sql. Ви вибираєте базу даних, резервну копію або знімок як джерело, а папку - як вихідне місце, і це прекрасно скидає все в структуру папок. Це трапляється в тому самому форматі, що і їх інший продукт, SQL Source Control.


Чи існує еквівалент у 2012 році? Я був би просто радий, якби майстер запам'ятав мої налаштування типу "Індекси сценаріїв".
PeterX

6
@PeterX SMSS> Інструменти> Опції> Провідник об'єктів SQL Server> Сценарій
zanlok

1
У 2012 році слідкуйте за цим посібником: simple-talk.com/sql/database-administration/…
Саймон Хатчісон

@zanlok дуже корисний коментар. На жаль, у SQL Server 2014.
відсутня

42

SqlPubwiz має дуже обмежені варіанти порівняно з генерацією сценарію в SSMS. На відміну від опцій, доступних для SMO, майже точно відповідають тим, що в SSMS, припускаючи, що це, мабуть, навіть той самий код. (Я би сподівався, що MS не написав це двічі!) Є кілька прикладів на 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

Приклад коду та посилань тут - чудовий початок, і він повинен бути найбільш повною відповіддю на ОП (що також було моїм точним запитанням).
zanlok

1
Я зламав додаток C #, який дозволяє створювати сценарії SQL-сервера з командного рядка в Linux. Все, що вам потрібно, це попередній перегляд .Net Core 2: github.com/mkurz/SQLServerScripter
mkurz

20

Я написав утиліту командного рядка з відкритим кодом на ім'я SchemaZen, яка робить це. Це набагато швидше, ніж сценарії з студії управління, і його вихід є більш зручним для контролю версій. Він підтримує сценарії як схеми, так і даних.

Щоб створити сценарії, виконайте такі дії:

schemazen.exe скрипт - сервер localhost - база даних db --scriptDir c: \ somedir

Потім, щоб відтворити базу даних із сценаріїв, виконайте:

schemazen.exe create --server localhost - база даних db --scriptDir c: \ somedir

Я щойно спробував SchemaZen і я дуже вражений. Працював вперше. Дякую Сет!
Саймон Хьюз,

@Seth, що ти використовуєш для сценарію об'єктів? Я не бачив жодної посилання на будь-який Microsoft.SqlServer нічого (ну не було жодного невикористаного використання оператора).
Джон

@John - Схема Zen містить власну бібліотеку для сценаріїв. Він зчитує схему в модель, потім генерує сценарії на основі моделі. Див. Github.com/sethreno/schemazen/blob/master/model/Models/… для простого прикладу.
Сет Рено



7

Я не бачу повноважень із 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

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

Сторінка проекту: http://sqlpsx.codeplex.com/

Основна перевага цього підходу полягає в тому, що він поєднує в собі конфігураційність / налаштованість прямого використання SMO, зручність та ремонтопридатність використання такого простого інструменту, як майстер публікації баз даних.


1
Я витратив деякий час на тестування цього рішення, але врешті-решт я звернувся до C # та за допомогою SMO. Проблема, яку я не міг легко знайти в минулому, полягає в тому, що приклад коду скриптує кожну таблицю окремо. Після того, як ви почнете додавати в 'DRI' (деклараційну референтну цілісність) об'єкти, як закордонні ключі, залежності не вийде правильно і / або буде дуже повільним.
OlduwanSteve

4

В Інструментах> Опції> Дизайнери> Дизайнери таблиць і баз даних існує опція "Автоматично створювати сценарії зміни", яка генеруватиме їх за кожну зміну, внесену під час її збереження.


3
Це не зовсім те, що мені потрібно. Я хотів би отримати сценарії створення (моя остаточна мета - автоматично перевірити ці файли в мою систему управління джерелами)
Brann

3

Ви можете це зробити з T-SQL кодом, використовуючи таблиці INFORMATION_SCHEMA.

Є також сторонні інструменти - мені подобається Apex SQL Script саме за те, як ви говорите. Я запускаю його повністю з командного рядка.


3

Спробуйте нові інструменти командного рядка SQL Server для створення сценаріїв T-SQL та відстеження динамічних представлень управління.

Працювали для мене як шарм. Це новий інструмент на основі python від Microsoft, який працює з командного рядка. Все працює так, як описано на сторінці Microsoft (див. Посилання нижче) Працював для мене з сервером SQL 2012.

Ви встановлюєте його за допомогою pip:

$ pip встановити mssql-скриптер

Огляд параметрів команди, як зазвичай, з допомогою h:

mssql-скриптер -h

Підказка: Якщо ви увійдете в SQL-сервер за допомогою автентифікації 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

Якщо ви хочете отримати рішення 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 року. Я також лише перевірявся на базі даних 2008 R2, і він також чудово сценаріїв.
Джеремі

2

Я використовую DB Comparer - це безкоштовний сценарій, який не вимагає суєти, і може порівнювати іншу БД, а також створювати сценарій Diff. Відмінно підходить для зміни сценаріїв розвитку до виробництва http://www.dbcomparer.com/


1

Існує також цей простий інструмент командного рядка, який я будую для своїх потреб.
http://mycodepad.wordpress.com/2013/11/18/export-ms-sql-database-schema-with-c/

Він може експортувати цілий db, і він намагається експортувати зашифровані об'єкти. Все зберігається у папках та окремих файлах sql для зручного порівняння файлів.

Код також доступний на github.


0

Від Visual Studio 2008 SP1 TeamSuite:

На вкладці "Провідник сервера / підключення до даних" є інструмент опублікування постачальника послуг, який робить те саме, що "Майстер публікації баз даних Microsoft SQL Server", але сумісний з MS Sql Server 2008.


Як це допомагає автоматизувати завдання?
Серж Вотьє

0

Я використовую VS 2012 (для БД на MSSQL Server 2008) база даних порівняння має можливість зберегти її, порівняння та параметри. По суті, це ваші налаштування щодо доставки. Після цього ви можете зробити оновлення або генерувати скрипт.

Мені просто здається трохи незручно завантажувати його з файлу пізніше (перетягування з Windows Explorer), оскільки я не бачу файл у провіднику рішень.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.