Как я могу автоматизировать задачу «создания сценариев» в SQL Server Management Studio 2008?

98

Я хотел бы автоматизировать генерацию скриптов в SQL Server Management Studio 2008.

Прямо сейчас я делаю следующее:

  • Щелкните правой кнопкой мыши мою базу данных, Задачи, «Создать сценарии ...»
  • вручную выберите все параметры экспорта, которые мне нужны, и нажмите «Выбрать все» на вкладке «Выбрать объект».
  • Выберите папку для экспорта
  • В конце концов нажмите кнопку "Готово"

Есть ли способ автоматизировать эту задачу?

Изменить: я хочу создавать сценарии создания , а не сценарии изменения.

Бранн
источник
ты нашел ответ? Я тоже хочу это сделать, я использовал Publishing, он сэкономил на жестком, не знаю где и там у меня нет всех опций, которые есть при генерации скрипта: -?
Алекса Адриан
1
Как упоминалось в нескольких ответах, используйте SMO, если вы разработчик
Джей Джей Джей

Ответы:

31

В Visual Studio 2008 SP1 Team Suite Бранн упоминает версию 1.4 мастера публикации баз данных. Он установлен с sql server 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). В настоящее время его нельзя использовать в сценариях из командной строки, я могу добавить этот вклад в будущем.

Изначально Scriptio был размещен в блоге Билла Грациано, но впоследствии был выпущен Биллом в CodePlex и обновлен другими. Прочтите обсуждение, чтобы узнать, как скомпилировать для использования с SQL Server 2008.

http://scriptio.codeplex.com/

РЕДАКТИРОВАТЬ: С тех пор я начал использовать продукт RedGate SQL Compare для этого. Это очень хорошая замена тому, чем должен был быть мастер публикации sql. Вы выбираете базу данных, резервную копию или моментальный снимок в качестве источника и папку в качестве места вывода, и все это красиво выгружается в структуру папок. Это тот же формат, что и другой их продукт, SQL Source Control.

глупый
источник
Есть ли аналог в 2012 году? Я был бы счастлив, если бы мастер запомнил мои настройки вроде «Индексы скриптов».
PeterX 06
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
Пример кода и ссылки здесь были отличным началом и должны быть наиболее полным ответом на OP (это был мой точный вопрос).
zanlok
1
Я собрал приложение C #, которое позволяет вам создавать сценарии SQL-сервера из командной строки в Linux. Все, что вам нужно, это предварительная
версия
20

Я написал утилиту командной строки с открытым исходным кодом под названием SchemaZen, которая делает это. Это намного быстрее, чем создание сценариев из студии управления, и его вывод более удобен для контроля версий. Он поддерживает создание сценариев как для схемы, так и для данных.

Чтобы сгенерировать скрипты, выполните:

schemazen.exe сценарий --server localhost --database db --scriptDir c: \ somedir

Затем для воссоздания базы данных из скриптов выполните:

schemazen.exe создать --server localhost --database db --scriptDir c: \ somedir
Сет Рино
источник
Я только что попробовал SchemaZen и очень впечатлен. Сработало впервые. Спасибо, Сет!
Саймон Хьюз
@Seth, так что вы используете для создания сценария объектов? Я не видел ни одной ссылки на какой-либо Microsoft.SqlServer (ну, там был один неиспользованный оператор using).
Джон
@John - Schema Zen содержит собственную библиотеку для написания скриптов. Он считывает схему в модель, а затем генерирует сценарии на основе модели. См. Простой пример на github.com/sethreno/schemazen/blob/master/model/Models/… .
Сет Рино
8

Если вы разработчик, определенно выбирайте SMO. Вот ссылка на класс 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/

Основное преимущество этого подхода состоит в том, что он сочетает в себе конфигурируемость / настраиваемость прямого использования SMO с удобством и удобством использования простого существующего инструмента, такого как Мастер публикации баз данных.

Дао
источник
1
Я потратил некоторое время на пробу этого решения, но в конце концов перешел на C # и стал использовать SMO. Проблема, которую я не мог легко решить, заключается в том, что в примере кода каждая таблица создается отдельно. Как только вы начнете добавлять в DRI (декларативную ссылочную целостность) объекты, такие как внешние ключи, он не сможет правильно определить зависимости и / или будет очень медленно.
OlduwanSteve,
4

В «Инструменты»> «Параметры»> «Дизайнеры»> «Дизайнеры таблиц и баз данных» есть опция «Автоматически создавать сценарии изменений», которая будет генерировать один для каждого изменения, которое вы вносите во время сохранения.

Джон Шиэн
источник
3
Это не совсем то, что мне нужно. Я хотел бы получить сценарии создания (моя конечная цель - автоматически зарегистрировать эти файлы в моей системе управления версиями)
Бранн,
3

Вы можете сделать это с помощью кода T-SQL, используя таблицы INFORMATION_SCHEMA.

Существуют также сторонние инструменты - мне нравится Apex SQL Script именно для того, о чем вы говорите. Я запускаю его полностью из командной строки.

Кейд Ру
источник
3

Попробуйте новые инструменты командной строки SQL Server для создания сценариев T-SQL и отслеживания динамических управленческих представлений.

Работал у меня как шарм. Это новый инструмент на основе Python от Microsoft, который запускается из командной строки. Все работает как описано на странице Microsoft (см. Ссылку ниже) У меня работало с SQL 2012 server.

Вы устанавливаете его с помощью pip:

$ pip установить mssql-scripter

Обзор параметров команды как обычно с h для справки:

mssql-scripter -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

Он создает пакетный процесс, который вы можете запускать в любое время, когда вам нужно перестроить скрипты.

Glennular
источник
1
К сожалению, он не поддерживает SqlServer 2008
Бранн,
1
Версия 1.2 говорит, что поддерживает 2000 и 2005, но я просто использовал ее для создания сценария базы данных в 2008 году с более чем 3800 таблицами, и он работал нормально. Он не включал параметры сжатия, которые не были представлены до 2008 года. Я также только что протестировал базу данных 2008 R2, и она также отлично выполняет сценарии.
Джереми
2

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

MartinC
источник
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», но совместим с MS Sql Server 2008.

Бранн
источник
Как это помогает автоматизировать задачу?
Серж Вотье,
0

Я использую VS 2012 (для баз данных на MSSQL Server 2008), база данных сравнения имеет возможность сохранить ее, сравнение и параметры. По сути, это ваши настройки для доставки. После этого вы можете обновить или сгенерировать скрипт.

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

жрист
источник