Como administrador de bases de datos (DBA), una de las tareas principales es implementar objetos de base de datos en un entorno en vivo o ejecutar scripts escritos por otros que modifican datos. Este proceso puede ser tedioso y propenso a errores humanos, especialmente cuando se trata de múltiples scripts y bases de datos. En este artículo, discutiremos un método simple para automatizar esta tarea utilizando SQL Server.
Suposiciones y requisitos previos
Para ejecutar automáticamente scripts en un orden predefinido, el método más fácil es asegurarse de que los nombres de archivo reflejen el orden de ejecución. Por ejemplo, si tiene tres archivos de script: ScriptA.sql, ScriptB.sql y ScriptC.sql, querrá nombrarlos como 1.ScriptA.sql, 2.ScriptB.sql y 3.ScriptC.sql.
El código proporcionado en este artículo asume que los scripts de origen se encuentran en una carpeta local del servidor de destino. Sin embargo, esta ubicación se puede cambiar para reflejar un directorio compartido en la red, siempre y cuando la cuenta de usuario que ejecuta el script tenga acceso a esa carpeta compartida.
La salida de los scripts se captura en archivos y se guarda en otra ubicación en el servidor. Esto puede ser útil para los desarrolladores que intentan solucionar problemas en una instalación fallida. El código utiliza tanto xp_cmdshell como la utilidad sqlcmd. Si xp_cmdshell está desactivado en el servidor de destino, debe habilitarse temporalmente para que el script funcione. La utilidad sqlcmd se envió por primera vez con SQL Server 2005 y no está disponible en versiones anteriores. Al modificar el script para sistemas basados en SQL Server 2000, puede utilizar la utilidad osql.
Descripción del código
El script proporcionado en este artículo se divide en dos secciones: una sección de inicialización donde se asigna metadatos relevantes a estructuras de datos y una sección de ejecución donde se ejecutan fragmentos de código fuente en una o más bases de datos.
- Después de establecer las carpetas de origen y destino y el nombre del servidor de destino, el código verifica si realmente se está ejecutando en el servidor previsto para evitar que los scripts se ejecuten accidentalmente en el servidor equivocado.
- A continuación, se compila una lista de bases de datos que no son del sistema. Esto se puede modificar para incluir cualquier número de bases de datos.
- A continuación, se compila la lista de scripts a partir de la carpeta de origen junto con el orden de su ejecución. Esto se hace utilizando el comando DIR de DOS junto con el uso de xp_cmdshell.
- Una vez completada la sección de inicialización, el código entra en un bucle doble. El bucle externo recorre la lista de bases de datos identificadas en el paso anterior.
- Para cada iteración del bucle de la base de datos, el bucle interno ejecuta los scripts de origen según su orden utilizando la utilidad sqlcmd.
- Las salidas de los scripts se guardan como archivos en disco, con los nombres de archivo de salida generados dinámicamente a partir de los nombres de las bases de datos actuales.
El código proporcionado en este artículo tiene como objetivo ser eficiente utilizando variables de tabla en lugar de tablas temporales y evitando el uso de cursores cuando se requiere un bucle. La conexión al servidor de base de datos puede ser confiable o no confiable, con el interruptor confiable (-E) en el comando sqlcmd reemplazado por los parámetros –Unombredeusuario y –Pcontraseña si es necesario.
Limitaciones
Tenga en cuenta que el script de automatización se ejecuta como el “llamador” de otros scripts y los ejecuta de forma sincrónica. Esto significa que esperará a que un script de origen termine de ejecutarse antes de invocar el siguiente. Si alguno de los scripts de origen genera un error en tiempo de ejecución, no se capturará porque el script de llamada no conoce la lógica interna. Si el fallo de un script debe evitar que se ejecuten archivos posteriores, eso no se puede lograr con este método. Sin embargo, los archivos de salida se pueden utilizar para evaluar el éxito o el fracaso de una implementación.
Conclusión
La automatización de la ejecución de scripts en SQL Server puede simplificar en gran medida el proceso y reducir las posibilidades de error humano. Siguiendo los pasos descritos en este artículo, puede ejecutar múltiples scripts en un orden predefinido en una o más bases de datos. Este método puede ser particularmente útil para DBAs y desarrolladores que necesitan implementar cambios en la base de datos o ejecutar scripts de manera controlada con frecuencia.