Hola, chicos,
¡Buenas tardes!

En esta publicación, demostraré una nueva característica de Transact-SQL disponible en SQL Server 2016 SP1, que es el comando CREAR O ALTERAR, que se puede aplicar a procedimientos, funciones, activadores y vistas.

Para los que trabajan o han trabajado con Oracle, sepan que esta es una copia de CREATE OR REPLACE, que existe en este DBMS desde hace muchísimos años y que desde mi primer contacto con SQL Server (SQL 2005) siempre me he preguntado por qué Microsoft no implementó esto, ya que facilitaba mucho el día a día de los DBA's y desarrolladores.

Hasta la creación de este recurso, para procedimientos, funciones, disparadores y vistas era posible utilizar 3 comandos:
- CREAR
– ALTERAR
- GOTA

Si el objeto en cuestión no existiera en la base y ejecutaras el comando ALTER, SQL devolvería un mensaje de error:

Si el objeto en cuestión existiera en la base de datos y ejecutara el comando CREATE, SQL también devolvería un mensaje de error:

Entonces, ¿cómo hizo el DBA/Desarrollador para evitar que estos mensajes de error ocurran al actualizar objetos?

Si existe, elimínelo y luego créelo.

Una forma de garantizar que la ejecución no devuelva un error es comprobar si el objeto existe en la base y, de ser así, eliminarlo de la vista/procedimiento/función/activador. En esta solución, veo dos grandes problemas:

  • El código DROP debe declararse explícitamente con el tipo de objeto (DROP VIEW, DROP FUNCTION, DROP PROCEDURE o DROP TRIGGER), lo que hace que nuestro código no sea tan genérico.
  • Al eliminar el objeto y volver a crearlo inmediatamente después, los permisos de ese objeto se pierden y los usuarios que tenían acceso a ese objeto ya no tendrán acceso. Para evitar que esto suceda, tendrás que guardar los permisos de cada objeto antes de eliminarlo y crearlo nuevamente, lo que puede generar mucho trabajo dependiendo de la cantidad de objetos a cambiar en la base de datos, además del riesgo y la responsabilidad de devolver todos los permisos para todos los objetos. Para guardar los permisos, puedes usar el script que puse a disposición en la publicación. Comprobar los permisos de un usuario en SQL Server.

Ejemplo de uso:

IF (OBJECT_ID('dbo.vwDatabases') IS NOT NULL) DROP VIEW dbo.vwDatabases
GO

CREATE VIEW dbo.vwDatabases
AS SELECT * FROM sys.databases

Si no existe, créelo y luego cámbielo.

Otra forma de garantizar la creación/cambio de objetos sin error es con la solución que presentaré a continuación, donde compruebo si el objeto existe y si no existe, creo un objeto “vacío” y luego ejecuto el comando ALTER con el código fuente correcto.

Esta solución es mejor que la anterior, ya que no tiene el problema de perder permisos de objetos, pero tiene el mismo problema de que el código no es generalista, ya que necesitarás definir el tipo de objeto en la instrucción de creación de objetos “vacíos” (CREAR VISTA, CREAR PROCEDIMIENTO, etc.)

Ejemplo de uso:

IF (OBJECT_ID('dbo.stpTeste') IS NULL) 
    EXEC('CREATE PROCEDURE dbo.stpTeste AS SELECT 1')
GO

ALTER PROCEDURE dbo.stpTeste
AS
BEGIN
    
    PRINT 'Código da SP alterado'
    SELECT 1

END

CREAR O ALTERAR

Característica disponible en SQL Server 2016 SP1, ahora es posible usar la instrucción CREATE OR ALTER al crear procedimientos almacenados, funciones, vistas y activadores. Al hacer esto, el propio SQL Server comprobará si el objeto existe y lo creará, si no existe, con el código fuente proporcionado o realizará un cambio en el código, si el objeto ya existe.

Ejemplo de uso:

-- Garantindo que o objeto não existe
IF (OBJECT_ID('dbo.stpTeste') IS NOT NULL) DROP PROCEDURE dbo.stpTeste
GO

-- Fazendo a criação/alteração da Stored Procedure
CREATE OR ALTER PROCEDURE dbo.stpTeste
AS
BEGIN
    
    PRINT 'Código da SP alterado'
    SELECT 1

END

Resultado:
Comando(s) completado(s) exitosamente.

Eso es todo, amigos.
Espero que hayas disfrutado de esta publicación y nos vemos la próxima.