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

97

Gostaria de automatizar a geração de script no SQL Server Management Studio 2008.

Agora o que eu faço é:

  • Clique com o botão direito em meu banco de dados, Tarefas, "Gerar Scripts ..."
  • selecione manualmente todas as opções de exportação de que preciso e clique em selecionar tudo na guia "selecionar objeto"
  • Selecione a pasta de exportação
  • Por fim, clique no botão "Concluir"

Existe uma maneira de automatizar essa tarefa?

Editar: desejo gerar scripts de criação , não alterar scripts.

Brann
fonte
você encontrou a resposta? Quero fazer isso também, usei Publishing, salvei no hard, não sei onde e aí não tenho todas as opções que estão na hora de gerar um script: -?
Alexa Adrian
1
Conforme mencionado em várias das respostas, use SMO se você for um desenvolvedor
Jay Jay Jay

Respostas:

31

O que Brann está mencionando do Visual Studio 2008 SP1 Team Suite é a versão 1.4 do Database Publishing Wizard. É instalado com sql server 2008 (talvez apenas profissional?) Em \ Arquivos de programas \ Microsoft SQL Server \ 90 \ Tools \ Publishing \ 1.4. A chamada VS do explorador do servidor está simplesmente chamando isso. Você pode obter a mesma funcionalidade por meio da linha de comando, como:

sqlpubwiz help script

Não sei se a v1.4 tem os mesmos problemas que a v1.1 (usuários são convertidos em funções, as restrições não são criadas na ordem certa), mas não é uma solução para mim porque não faz script de objetos 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 banco de dados (sqlpubwiz.exe). Atualmente não é possível fazer scripts a partir da linha de comando, devo adicionar essa contribuição no futuro.

Scriptio foi postado originalmente no blog de Bill Graziano, mas posteriormente foi liberado 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: Eu comecei a usar o produto SQL Compare da RedGate para fazer isso. É um substituto muito bom para tudo o que o assistente de publicação sql deveria ter sido. Você escolhe um banco de dados, backup ou instantâneo como fonte e uma pasta como local de saída e tudo é despejado em uma estrutura de pastas. Acontece que é o mesmo formato que seu outro produto, o SQL Source Control, usa.

noóbico
fonte
Existe um equivalente em 2012? Eu ficaria feliz se o assistente se lembrasse de minhas configurações como "Índices de script".
PeterX
6
@PeterX SMSS> Ferramentas> Opções> SQL Server Object Explorer> Scripting
zanlok
1
Para 2012, siga este guia: simple-talk.com/sql/database-administration/…
Simon Hutchison
@zanlok comentário muito útil. Infelizmente, eles não têm a opção "Incluir instruções não suportadas" no SQL Server 2014.
jk7
42

SqlPubwiz tem opções muito limitadas em comparação com a geração de script no SSMS. Em contraste, as opções disponíveis no SMO correspondem quase exatamente às do SSMS, sugerindo que provavelmente é o mesmo código. (Espero que a MS não o tenha escrito duas vezes!) Existem vários exemplos no MSDN como este que mostra tabelas de script como objetos individuais. No entanto, se você quiser que tudo seja executado corretamente com um esquema 'completo' que inclua objetos 'DRI' (Integridade referencial declarativa) como chaves estrangeiras, então o script de tabelas individualmente não funciona com as dependências corretamente. Descobri que é necessário coletar todos os URNs e entregá-los ao criador de scripts como um array. Este código, modificado a partir do exemplo,

    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();
OlduwanSteve
fonte
9
Você pode examinar a classe Microsoft.SqlServer.Management.SqlScriptPublish.ScriptPublishWizarddo assembly C: \ Arquivos de programas (x86) \ Microsoft SQL Server \ 110 \ Tools \ Binn \ ManagementStudio \ Microsoft.SqlServer.Management.SqlScriptPublishUI.dll. Isso é o que o SSMS usa. (Como alternativa, você pode olhar para a classe Microsoft.SqlServer.Management.UI.GenerateScriptdo assembly C: \ Arquivos de programas (x86) \ Microsoft SQL Server \ 110 \ Tools \ Binn \ ManagementStudio \ ReplicationDialog.dll.)
cubetwo1729
O código de exemplo e os links aqui foram um ótimo começo e devem ser a resposta mais completa para o OP (que foi exatamente minha pergunta).
zanlok de
1
Eu hackeei um aplicativo C # que permite gerar scripts de servidor SQL a partir da linha de comando do Linux. Tudo que você precisa é uma prévia do .Net Core 2: github.com/mkurz/SQLServerScripter
mkurz
20

Eu escrevi um utilitário de linha de comando de código aberto chamado SchemaZen que faz isso. É muito mais rápido do que o script do Management Studio e sua saída é mais amigável ao controle de versão. Ele oferece suporte a scripts de esquema e dados.

Para gerar scripts, execute:

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

Em seguida, para recriar o banco de dados a partir dos scripts, execute:

schemazen.exe create --server localhost --database db --scriptDir c: \ somedir
Seth Reno
fonte
Acabei de experimentar o SchemaZen e estou realmente impressionado. Trabalhou pela primeira vez. Obrigado Seth!
Simon Hughes
@Seth então o que você está usando para fazer o script dos objetos? Eu não vi uma única referência a qualquer coisa Microsoft.SqlServer (bem, havia uma única instrução using não utilizada).
John
@John - Schema Zen contém sua própria biblioteca para scripts. Ele lê o esquema em um modelo e, em seguida, gera os scripts com base no modelo. Veja github.com/sethreno/schemazen/blob/master/model/Models/… para um exemplo simples.
Seth Reno
7

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

Classe Scripter

Ryan Lundy
fonte
7

Não vejo o powershell com SQLPSX mencionado em nenhuma dessas respostas ... Eu pessoalmente não brinquei com ele, mas parece muito simples de usar e idealmente adequado para este 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 configurabilidade / personalização do uso direto do SMO, com a conveniência e facilidade de manutenção de usar uma ferramenta simples existente como o Database Publishing Wizard.

Tao
fonte
1
Passei um tempo experimentando essa solução, mas no final voltei para C # e usei o SMO. O problema que eu não conseguia encontrar facilmente é que o código de exemplo cria um script de cada tabela individualmente. Assim que você começar a adicionar objetos 'DRI' (Integridade Referencial Declarativa) como chaves estrangeiras, ele não obterá as dependências certas e / ou será muito lento.
OlduwanSteve
4

Em Ferramentas> Opções> Designers> Designers de tabelas e bancos de dados, há uma opção para 'Gerar scripts de alteração automaticamente' que irá gerar um para cada alteração feita no momento em que você salvá-lo.

John Sheehan
fonte
3
Não é exatamente disso que preciso. Gostaria de obter os scripts de criação (meu objetivo final é fazer o check-in automático desses arquivos em meu sistema de controle de origem)
Brann
3

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

Existem também ferramentas de terceiros - eu gosto do Apex SQL Script exatamente pelo uso que você está falando. Eu o executo completamente na linha de comando.

Cade Roux
fonte
3

Experimente as novas ferramentas de linha de comando do SQL Server para gerar scripts T-SQL e monitorar exibições de gerenciamento dinâmico.

Funcionou para mim como charme. É uma nova ferramenta baseada em python da Microsoft que roda na linha de comando. Tudo funciona conforme descrito na página da Microsoft (ver link abaixo) Funcionou para mim com o servidor SQL 2012.

Você o instala com pip:

$ pip install mssql-scripter

Visão geral dos parâmetros de comando, como de costume, com h para obter ajuda:

mssql-scripter -h

Dica: Se você efetuar login no SQL-Server por meio da autenticação do Windows, deixe de lado o nome de usuário e a senha.

https://cloudblogs.microsoft.com/sqlserver/2017/05/17/try-new-sql-server-command-line-tools-to-generate-t-sql-scripts-and-monitor-dynamic-management- Visualizações/

Matthhias
fonte
2

Se você deseja uma solução da Microsoft, 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 a qualquer momento que precisar reconstruir os scripts.

Glennular
fonte
1
Infelizmente, ele não suporta SqlServer 2008
Brann
1
A versão 1.2 diz que suporta 2000 e 2005, mas eu apenas usei para criar um script de banco de dados em 2008 com mais de 3800 tabelas e funcionou bem. Ele não incluiu opções de compactação, que não foram introduzidas até 2008. Eu também acabei de testar em um banco de dados R2 2008 e seus scripts também funcionam bem.
Jeremy
2

Tenho usado o DB Comparer - é um script de banco de dados livre e sem complicações e pode ser comparado a outro banco de dados e também produzir um script Diff. Excelente para scripts de mudança de desenvolvimento para produção. http://www.dbcomparer.com/

MartinC
fonte
1

Também existe esta ferramenta de linha de comando simples que construí para minhas necessidades.
http://mycodepad.wordpress.com/2013/11/18/export-ms-sql-database-schema-with-c/

Ele pode exportar um banco de dados inteiro e tenta exportar objetos criptografados. Tudo é armazenado em pastas e arquivos sql separados para fácil comparação de arquivos.

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

George Kosmidis
fonte
0

Do Visual Studio 2008 SP1 TeamSuite:

Na guia Server Explorer / Data Connections, há uma ferramenta de publicação para provedor que faz o mesmo que "Assistente de publicação de banco de dados do Microsoft SQL Server", mas é compatível com MS Sql Server 2008.

Brann
fonte
Como isso ajuda a automatizar a tarefa?
Serge Wautier
0

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

Eu apenas acho um pouco estranho carregá-lo do arquivo mais tarde (arrastar e soltar do Windows Explorer), pois não vejo o arquivo no Solution Explorer.

zhrist
fonte