Como posso automatizar a tarefa “gerar scripts” no SQL Server Management Studio 2008?

Eu gostaria de automatizar a geração de scripts no SQL Server Management Studio 2008.

Agora o que eu faço é:

  • Clique com o botão direito no meu database, Tarefas, “Gerar Scripts …”
  • selecione manualmente todas as opções de exportação de que preciso e clique em selecionar tudo na guia “selecionar object”
  • Selecione a pasta de exportação
  • Eventualmente aperte o botão “Concluir”

Existe uma maneira de automatizar essa tarefa?

Edit: Eu quero gerar scripts de criação , não alterar scripts.

O que Brann está mencionando do Visual Studio 2008 SP1 Team Suite é a versão 1.4 do Database Publishing Wizard. É instalado com o SQL Server 2008 (talvez apenas profissional?) Para \ Arquivos de Programas \ Microsoft SQL Server \ 90 \ Ferramentas \ Publishing \ 1.4. A chamada VS do servidor explorador é simplesmente chamar isso. Você pode conseguir a mesma funcionalidade através da linha de comando como:

sqlpubwiz help script 

Não sei se a v1.4 tem os mesmos problemas que a v1.1 (os usuários são convertidos em funções, as restrições não são criadas na ordem correta), mas não é uma solução para mim porque não cria scripts de objects para arquivos diferentes como a opção Tasks-> Generate Scripts no SSMS. Atualmente, estou usando uma versão modificada do Scriptio (usa a API MS SMO) para atuar como um substituto aprimorado para o assistente de publicação de database (sqlpubwiz.exe). Não é atualmente scriptable da linha de comando, eu poderia adicionar essa contribuição no futuro.

Scriptio foi originalmente publicado no blog de Bill Graziano, mas foi posteriormente lançado para o CodePlex por Bill e atualizado por outros. Leia a discussão para ver como compilar para uso com o SQL Server 2008.

http://scriptio.codeplex.com/

EDIT: Desde então comecei a usar o produto SQL Compare do RedGate para fazer isso. É um substituto muito bom para todos os que o assistente de publicação do SQL deveria ter sido. Você escolhe um database, um backup ou um instantâneo como a origem e uma pasta como o local de saída e despeja tudo bem em uma estrutura de pastas. Acontece que é o mesmo formato que o outro produto, o SQL Source Control, usa.

O SqlPubwiz tem opções muito limitadas em comparação com a geração de scripts no SSMS. Por outro lado, as opções disponíveis com o SMO correspondem exatamente às do SSMS, sugerindo que provavelmente é o mesmo código. (Espero que o MS não tenha escrito duas vezes!) Existem vários exemplos no MSDN como este que mostram tabelas de script como objects individuais. No entanto, se você quiser que tudo seja roteiro corretamente com um esquema ‘completo’ que inclua objects ‘DRI’ (Integridade Referencial Declarativa) como foreign keys, então as tabelas de script individualmente não funcionam corretamente as dependencies. Eu achei que é necessário coletar todos os URNs e entregá-los ao roteirista como um array. Este código, modificado a partir do exemplo, funciona para mim (embora eu possa dizer que você poderia arrumá-lo e comentar um pouco mais):

 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(); // 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(); 

Eu escrevi um utilitário de linha de comando de código aberto chamado SchemaZen que faz isso. É muito mais rápido que o script do estúdio de gerenciamento e sua saída é mais amigável ao version control. Ele suporta scripts de esquema e dados.

Para gerar scripts, execute:

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

Então, para recriar o database a partir de scripts, execute:

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

Você pode usar o SMO (SQL Server Management Object) para automatizar as tarefas de gerenciamento do SQL Server 2005, incluindo a geração de scripts: http://msdn.microsoft.com/pt-br/library/ms162169.aspx .

Se você é um desenvolvedor, definitivamente vá com o SMO. Aqui está um link para a class Scripter, que é o seu ponto de partida:

Classe de Scripter

Eu não vejo o powershell com SQLPSX mencionado em nenhuma dessas respostas … Eu pessoalmente não brinquei com isso, mas ele é muito simples de usar e ideal para esse tipo de tarefas de automação, com tarefas como:

 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 )

Página do projeto: http://sqlpsx.codeplex.com/

A principal vantagem dessa abordagem é que ela combina a capacidade de configuração / personalização de usar o SMO diretamente, com a conveniência e capacidade de manutenção de usar uma ferramenta existente e simples, como o Assistente de Publicação de Banco de Dados.

Em Ferramentas> Opções> Designers> Criadores de tabelas e bancos de dados, há uma opção para “Gerar scripts de mudança automática” que gerará um para cada alteração feita no momento em que você salvá-lo.

Você pode fazer isso com o código T-SQL usando as tabelas INFORMATION_SCHEMA.

Há também ferramentas de terceiros – eu gosto do Apex SQL Script para o uso exato que você está falando. Eu corro completamente a partir da linha de comando.

Se você quiser uma solução Microsoft, você pode tentar: Microsoft SQL Server Database Publishing Wizard 1.1

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

Ele cria um processo em lote que você pode executar sempre que precisar reconstruir os scripts.

Eu tenho usado DB Comparer – Seu livre e nenhum script de espalhafato inteiro DB e pode comparar a outro DB e também produzir um script Diff. Excelentes para o desenvolvimento de scripts de mudança de produção. http://www.dbcomparer.com/

Há também esta ferramenta de linha de comando simples que eu construo para as minhas necessidades.
http://mycodepad.wordpress.com/2013/11/18/export-ms-sql-database-schema-with-c/

Pode exportar um database inteiro e tenta exportar objects criptografados. Tudo é armazenado em pastas e arquivos sql separados para facilitar a comparação de arquivos.

O código também está disponível no github.

Do Visual Studio 2008 SP1 TeamSuite:

Na guia Server Explorer / Data Connections, há uma ferramenta publish to provider que faz o mesmo que “Assistente de Publicação de Banco de Dados do Microsoft SQL Server”, mas que é compatível com o MS Sql Server 2008.

Estou usando o VS 2012 (para bancos de dados no MSSQL Server 2008) comparar database tem uma opção para salvá-lo, a comparação e as opções. Essencialmente, são essas as suas configurações para entrega. Depois disso, você pode atualizar ou gerar scripts.

Eu só acho um pouco estranho para carregá-lo do arquivo mais tarde (arrastar e soltar do Windows Explorer) como eu não vejo o arquivo no explorador de soluções.