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


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 necesite y presione seleccionar todo en la pestaña "seleccionar objeto"
  • Seleccione la carpeta de exportación
  • Finalmente presione el botón" Finalizar "

¿Hay alguna forma de automatizar esta tarea?

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

Author: Brann, 2009-01-27

13 answers

Lo que Brann está mencionando de Visual Studio 2008 SP1 Team Suite es la versión 1.4 del Asistente de Publicación de Bases de datos. Se instala con sql server 2008(tal vez solo profesional?) a \Archivos de programa \ Microsoft SQL Server \ 90 \ Herramientas\Publicación \ 1.4. La llamada VS desde el explorador del servidor es simplemente llamar a esto. Puede lograr la misma funcionalidad a través de la línea de comandos como:

sqlpubwiz help script

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

Scriptio fue publicado originalmente en el blog de Bill Graziano, pero posteriormente ha sido lanzado a CodePlex por Bill y actualizado por otros. Lea la discusión para ver cómo compilar para usar con SQL Server 2008.

Http://scriptio.codeplex.com/

EDITAR: Desde entonces he comenzado a usar el producto SQL Compare de RedGate para hacer esto. Es un muy buen reemplazo para todo lo que sql publishing wizard debería haber sido. Elige una base de datos, una copia de seguridad o una instantánea como origen, y una carpeta como ubicación de salida y vuelca todo muy bien en un estructura de carpetas. Sucede que es el mismo formato que su otro producto, SQL Source Control, utiliza.

 31
Author: noobish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-06 19:53:01

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 los SSM, lo que sugiere que probablemente sea incluso el mismo código. (¡Espero que MS no lo haya escrito dos veces! Hay varios ejemplos en MSDN como este que muestran tablas de scripting como objetos individuales. Sin embargo, si desea que todo se script correctamente con un esquema 'completo' que incluye ' DRI ' (Integridad Referencial Declarativa) los objetos como las claves foráneas a continuación, scripting tablas individualmente no funciona las dependencias correctamente. Encontré que es necesario recoger todas las urnas y entregarlas al scripter como una matriz. Este código, modificado del ejemplo, funciona para mí (aunque me atrevo a decir que podría ordenarlo y comentarlo un poco más):

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();
 36
Author: OlduwanSteve,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-25 17:27:06

Escribí una utilidad de línea de comandos de código abierto llamada SchemaZen que hace esto. Es mucho más rápido que el scripting desde management Studio y su salida es más amigable con el control de versiones. Soporta scripting tanto de esquemas como de datos.

Para generar scripts ejecute:

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

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

schemazen.exe create --server localhost --database db --scriptDir c:\somedir
 13
Author: Seth Reno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-16 14:48:52

Puede usar SQL Server Management Object (SMO) para automatizar las tareas de administración de SQL Server 2005, incluida la generación de scripts: http://msdn.microsoft.com/en-us/library/ms162169.aspx .

 12
Author: Joe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-27 14:41:51

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

Clase de Scripter

 7
Author: Ryan Lundy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-27 15:01:46

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 e ideal para 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 / posibilidad de personalizar el uso directo de SMO, con la conveniencia y el mantenimiento de utilizar una herramienta simple existente como el Asistente de Publicación de Bases de datos.

 7
Author: Tao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-13 06:55:46

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

 4
Author: John Sheehan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-27 14:27:24

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

También hay herramientas de terceros-Me gusta Apex SQL Script para precisamente el uso que usted está hablando. Lo ejecuté completamente desde la línea de comandos.

 3
Author: Cade Roux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-27 14:36:13

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 reconstruir los scripts.

 2
Author: Glennular,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-27 14:57:44

He estado usando DB Comparer - Su libre y sin complicaciones script toda la base de datos y se puede comparar con otra base de datos y también producir un script Diff . Excelente para el Desarrollo de scripts de cambio de Producción. http://www.dbcomparer.com /

 2
Author: MartinC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-30 08:30:14

También existe esta sencilla herramienta de línea de comandos que compilo para mi needs.
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 una fácil comparación de archivos.

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

 1
Author: George Kosmidis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-27 14:04:32

De Visual Studio 2008 SP1 TeamSuite:

En la pestaña Server Explorer / Data Connections, hay una herramienta publicar en proveedor que hace lo mismo que "Microsoft SQL Server Database Publishing Wizard", pero que es compatible con MS Sql Server 2008.

 0
Author: Brann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-27 15:12:18

Estoy usando VS 2012(para DBs en MSSQL Server 2008) compare database tiene una opción para guardarla, la comparación y las opciones. Esto es esencialmente lo que son los ajustes para la entrega. Después de eso, puede actualizar o generar script.

Simplemente 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.

 0
Author: zhrist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-07 07:44:21