¿Cómo puedo automatizar la tarea "generar scripts" en SQL Server Management Studio 2008?

97

Me gustaría automatizar la generación de scripts en SQL Server Management Studio 2008.

Ahora mismo lo que hago es:

  • Haga clic derecho en mi base de datos, Tareas, "Generar scripts ..."
  • seleccione manualmente todas las opciones de exportación que necesito y presione seleccionar todo en la pestaña "seleccionar objeto"
  • Seleccione la carpeta de exportación
  • Finalmente, presione el botón "Finalizar"

¿Existe alguna forma de automatizar esta tarea?

Editar: Quiero generar scripts de creación , no cambiar scripts.

Brann
fuente
encontraste la respuesta? Yo también quiero hacer esto, usé Publishing, se guardó en disco, no sé dónde y ahí no tengo todas las opciones que hay al generar un script: -?
Alexa Adrian
1
Como se menciona en varias de las respuestas, use SMO si es un desarrollador
Jay Jay Jay

Respuestas:

31

Lo que Brann menciona de Visual Studio 2008 SP1 Team Suite es la versión 1.4 del Asistente para publicación de bases de datos. Está instalado con sql server 2008 (¿tal vez solo profesional?) En \ Program Files \ Microsoft SQL Server \ 90 \ Tools \ Publishing \ 1.4. La llamada VS del explorador del servidor simplemente está llamando a esto. Puede lograr la misma funcionalidad a través de la línea de comando como:

sqlpubwiz help script

No sé si la v1.4 tiene los mismos problemas que la v1.1 (los usuarios se convierten en roles, las restricciones no se crean en el orden correcto), pero no es una solución para mí porque no crea secuencias de comandos de objetos a diferentes archivos como la opción Tareas-> Generar scripts en SSMS. Actualmente estoy usando una versión modificada de Scriptio (usa la API MS SMO) para actuar como un reemplazo mejorado para el asistente de publicación de bases de datos (sqlpubwiz.exe). Actualmente no se puede programar desde la línea de comandos, podría agregar esa contribución en el futuro.

Scriptio se publicó originalmente en el blog de Bill Graziano, pero posteriormente Bill lo publicó en CodePlex y otros lo actualizaron. Lea la discusión para ver cómo compilar para usar con SQL Server 2008.

http://scriptio.codeplex.com/

EDITAR: Desde entonces comencé a usar el producto SQL Compare de RedGate para hacer esto. Es un reemplazo muy bueno para todo lo que debería haber sido el asistente de publicación de SQL. Eliges una base de datos, una copia de seguridad o una instantánea como fuente y una carpeta como ubicación de salida y lo vuelca todo muy bien en una estructura de carpetas. Resulta ser el mismo formato que usa su otro producto, SQL Source Control.

novato
fuente
¿Existe un equivalente en 2012? Estaría feliz si el asistente recordara mi configuración como "Índices de secuencia de comandos".
PeterX
6
@PeterX SMSS> Herramientas> Opciones> Explorador de objetos de SQL Server> Scripting
zanlok
1
Para 2012, siga esta guía: simple-talk.com/sql/database-administration/…
Simon Hutchison
@zanlok comentario muy útil. Desafortunadamente, les falta la opción "Incluir declaraciones no compatibles" en SQL Server 2014.
jk7
42

SqlPubwiz tiene opciones muy limitadas en comparación con la generación de scripts en SSMS. Por el contrario, las opciones disponibles con SMO coinciden casi exactamente con las de SSMS, lo que sugiere que probablemente sea el mismo código. (¡Espero que MS no lo haya escrito dos veces!) Hay varios ejemplos en MSDN como este que muestran tablas de secuencias de comandos como objetos individuales. Sin embargo, si desea que todo se ejecute correctamente con un esquema 'completo' que incluya objetos 'DRI' (integridad referencial declarativa) como claves externas, las tablas de secuencias de comandos individualmente no resuelven las dependencias correctamente. Descubrí que es necesario recopilar todos los URN y entregárselos al scripter como una matriz. Este código, modificado del ejemplo,

    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
fuente
9
Puede ver la clase Microsoft.SqlServer.Management.SqlScriptPublish.ScriptPublishWizarddel ensamblado C: \ Archivos de programa (x86) \ Microsoft SQL Server \ 110 \ Tools \ Binn \ ManagementStudio \ Microsoft.SqlServer.Management.SqlScriptPublishUI.dll. Esto es lo que usa SSMS. (Alternativamente, puede mirar la clase Microsoft.SqlServer.Management.UI.GenerateScriptdel ensamblado C: \ Archivos de programa (x86) \ Microsoft SQL Server \ 110 \ Tools \ Binn \ ManagementStudio \ ReplicationDialog.dll.)
cubetwo1729
El código de ejemplo y los enlaces aquí fueron un gran comienzo, y deberían ser la respuesta más completa al OP (que también era mi pregunta exacta).
zanlok
1
Hackeé una aplicación C # que le permite generar scripts de servidor SQL desde la línea de comandos en Linux. Todo lo que necesita es una vista previa de .Net Core 2: github.com/mkurz/SQLServerScripter
mkurz
20

Escribí una utilidad de línea de comando de código abierto llamada SchemaZen que hace esto. Es mucho más rápido que la creación de scripts desde Management Studio y su salida es más amigable con el control de versiones. Admite la creación de scripts tanto de esquema como de datos.

Para generar scripts, ejecute:

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

Luego, para recrear la base de datos a partir de scripts, ejecute:

schemazen.exe crear --server localhost --database db --scriptDir c: \ somedir
Seth Reno
fuente
Acabo de probar SchemaZen y estoy realmente impresionado. Trabajó por primera vez. ¡Gracias Seth!
Simon Hughes
@Seth, ¿qué estás usando para escribir los objetos? No vi una sola referencia a ningún Microsoft.SqlServer nada (bueno, había una sola declaración de uso no utilizada).
John
@John - Schema Zen contiene su propia biblioteca para scripts. Lee el esquema en un modelo y luego genera los scripts basados ​​en el modelo. Consulte github.com/sethreno/schemazen/blob/master/model/Models/… para ver un ejemplo sencillo.
Seth Reno
7

Si eres un desarrollador, definitivamente elige SMO. Aquí hay un enlace a la clase Scripter, que es su punto de partida:

Clase de scripter

Ryan Lundy
fuente
7

No veo que powershell con SQLPSX se mencione en ninguna de estas respuestas ... Personalmente no he jugado con él, pero parece muy fácil de usar y se adapta idealmente a este tipo de tareas de automatización, con tareas 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 del proyecto: http://sqlpsx.codeplex.com/

La principal ventaja de este enfoque es que combina la configurabilidad / personalización de usar SMO directamente, con la conveniencia y facilidad de mantenimiento de usar una herramienta simple existente como el Asistente de publicación de bases de datos.

Tao
fuente
1
Pasé un tiempo probando esta solución, pero al final recurrí a C # y utilicé SMO. El problema que no pude encontrar fácilmente es que el código de ejemplo escribe cada tabla individualmente. Una vez que comience a agregar objetos 'DRI' (integridad referencial declarativa) como claves externas, las dependencias no serán correctas y / o será muy lento.
OlduwanSteve
4

En Herramientas> Opciones> Diseñadores> Diseñadores de tablas y bases de datos, hay una opción para 'Generar scripts de cambio automáticamente' que generará uno por cada cambio que realice en el momento de guardarlo.

John Sheehan
fuente
3
Eso no es exactamente lo que necesito. Me gustaría obtener los scripts de creación (mi objetivo final es registrar automáticamente esos archivos en mi sistema de control de fuente)
Brann
3

Puede hacerlo con código T-SQL usando las tablas INFORMATION_SCHEMA.

También hay herramientas de terceros: me gusta Apex SQL Script precisamente para el uso del que está hablando. Lo ejecuto completamente desde la línea de comandos.

Cade Roux
fuente
3

Pruebe las nuevas herramientas de línea de comandos de SQL Server para generar scripts T-SQL y supervisar las vistas de administración dinámica.

Funcionó para mí como un encanto. Es una nueva herramienta basada en Python de Microsoft que se ejecuta desde la línea de comandos. Todo funciona como se describe en la página de Microsoft (ver enlace a continuación) Funcionó para mí con el servidor SQL 2012.

Lo instalas con pip:

$ pip instalar mssql-scripter

Resumen de parámetros de comando como de costumbre con h para ayuda:

mssql-scripter -h

Sugerencia: si inicia sesión en SQL-Server a través de la autenticación de Windows, simplemente deje el nombre de usuario y la contraseña.

https://cloudblogs.microsoft.com/sqlserver/2017/05/17/try-new-sql-server-command-line-tools-to-generate-t-sql-scripts-and-monitor-dynamic-management- puntos de vista/

Matías
fuente
2

Si desea una solución de Microsoft, puede probar: Microsoft SQL Server Database Publishing Wizard 1.1

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

Crea un proceso por lotes que puede ejecutar en cualquier momento que necesite para reconstruir los scripts.

Glennular
fuente
1
Desafortunadamente, no es compatible con SqlServer 2008
Brann
1
La versión 1.2 dice que es compatible con 2000 y 2005, pero solo lo usé para crear un script en una base de datos en 2008 con más de 3800 tablas y funcionó bien. No incluía opciones de compresión, que no se introdujeron hasta 2008. También acabo de probar con una base de datos de 2008 R2 y los scripts también están bien.
Jeremy
2

He estado usando DB Comparer: es un script de DB completo gratuito y sin complicaciones y se puede comparar con otro DB y también producir un script Diff. Excelente para scripts de cambio de desarrollo a producción. http://www.dbcomparer.com/

MartinC
fuente
1

También existe esta sencilla herramienta de línea de comandos que creo para mis necesidades.
http://mycodepad.wordpress.com/2013/11/18/export-ms-sql-database-schema-with-c/

Puede exportar una base de datos completa e intenta exportar objetos cifrados. Todo se almacena en carpetas y archivos sql separados para facilitar la comparación de archivos.

El código también está disponible en github.

George Kosmidis
fuente
0

Desde Visual Studio 2008 SP1 TeamSuite:

En la pestaña Server Explorer / Data Connections, hay una herramienta de publicación en el proveedor que hace lo mismo que el "Asistente de publicación de bases de datos de Microsoft SQL Server", pero que es compatible con MS Sql Server 2008.

Brann
fuente
¿Cómo ayuda a automatizar la tarea?
Serge Wautier
0

Estoy usando VS 2012 (para DB en MSSQL Server 2008) la base de datos de comparación tiene una opción para guardarla, la comparación y las opciones. Ésta es esencialmente la configuración para la entrega. Después de eso, puede actualizar o generar un script.

Me resulta un poco incómodo cargarlo desde el archivo más tarde (arrastrar y soltar desde el explorador de Windows) ya que no veo el archivo en el explorador de soluciones.

zhrist
fuente