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

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

Сейчас я делаю:

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

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

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

Ответ 1

Что говорит Бранн из 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 (пользователи преобразуются в роли, ограничения не создаются в правильном порядке), но это не решение для меня, потому что оно не " t script объекты в разные файлы, такие как параметр Задачи- > Сгенерировать скрипты в SSMS. В настоящее время я использую модифицированную версию Scriptio (использует MS SMO API), чтобы действовать как улучшенная замена мастера публикации базы данных (sqlpubwiz.exe). В настоящее время он не доступен для сценариев из командной строки, я мог бы добавить этот вклад в будущем.

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

http://scriptio.codeplex.com/

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

Ответ 2

SqlPubwiz имеет очень ограниченные возможности по сравнению с генерацией script в SSMS. В отличие от опций, доступных с SMO, почти точно совпадают с возможностями в SSMS, предполагая, что это, вероятно, даже тот же код. (Я бы надеялся, что MS не написал его дважды!) В MSDN есть несколько примеров, например этот, которые показывают скриптовые таблицы как отдельные объекты. Однако, если вы хотите, чтобы все было script правильно с "полной" схемой, которая включает в себя объекты "DRI" (декларативная ссылочная целостность), такие как внешние ключи, тогда таблицы сценариев по отдельности не корректно работают с зависимостями. Я обнаружил, что необходимо собрать все URN и передать их скриптору в виде массива. Этот код, модифицированный из примера, работает для меня (хотя, полагаю, вы могли бы его убрать и прокомментировать его немного):

using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Sdk.Sfc;
...
// 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();

Ответ 3

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

Для запуска запуска скриптов:

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

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

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

Ответ 4

Вы можете использовать объект управления SQL Server (SMO) для автоматизации задач управления SQL Server 2005, включая создание сценариев: http://msdn.microsoft.com/en-us/library/ms162169.aspx.

Ответ 5

Если вы разработчик, обязательно займитесь SMO. Здесь ссылка на класс Scripter, который является вашей отправной точкой:

Класс скриптов

Ответ 6

Я не вижу 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

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

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

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

Ответ 7

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

Ответ 8

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

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

Ответ 10

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

Ответ 11

Существует также этот простой инструмент командной строки, который я строю для своих нужд.
http://mycodepad.wordpress.com/2013/11/18/export-ms-sql-database-schema-with-c/

Он может экспортировать весь db и пытается экспортировать зашифрованные объекты. Все хранится в папках и отдельных файлах sql для легкого сравнения файлов.

Код также доступен в github.

Ответ 12

Из Visual Studio 2008 SP1 TeamSuite:

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

Ответ 13

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

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

Ответ 14

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

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

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

$ pip install mssql-scripter

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

mssql-scripter -h

Подсказка: если вы входите в SQL-Server с помощью аутентификации Windows, просто оставьте имя пользователя и пароль.