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

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

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

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

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

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

Ответы [ 14 ]

38 голосов
/ 25 июля 2012

SqlPubwiz имеет очень ограниченные возможности по сравнению с генерацией скриптов в SSMS. В отличие от этого опции, доступные с SMO , почти точно совпадают с опциями в SSMS, предполагая, что это, вероятно, даже тот же код (Я надеюсь, что MS не написал это дважды!) На MSDN есть несколько примеров, таких как , этот , которые показывают таблицы сценариев как отдельные объекты. Однако, если вы хотите, чтобы все правильно создавалось в сценарии с «полной» схемой, включающей объекты «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();
31 голосов
/ 06 мая 2010

Бранн упоминает в 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.

13 голосов
/ 06 сентября 2013

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

Для генерации скриптов запустите:

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

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

schemazen.exe create --server localhost --database db --scriptDir c:\somedir
12 голосов
/ 27 января 2009

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

7 голосов
/ 13 октября 2011

Я не вижу 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 голосов
/ 27 января 2009

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

Класс Scripter

4 голосов
/ 27 января 2009

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

3 голосов
/ 27 января 2009

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

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

2 голосов
/ 30 ноября 2011

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

2 голосов
/ 27 января 2009

Если вы хотите использовать решение Microsoft, вы можете попробовать: Мастер публикации баз данных Microsoft SQL Server 1.1

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

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

...