SQL Server 2016 SP1 – CREATE OR ALTER em procedures, functions, triggers e views

SQL Server 2016 SP1 – CREATE OR ALTER em procedures, functions, triggers e views
5 (100%) 1 voto

Olá pessoal,
Boa tarde!

Neste post vou demonstrar um novo recurso do Transact-SQL disponível a partir do SQL Server 2016 SP1, que é o comando CREATE OR ALTER, que pode ser aplicado em procedures, functions, triggers e views.

Para quem trabalha ou já trabalhou com Oracle, sabe que isso é uma cópia do CREATE OR REPLACE, existente nesse SGBD há muitos e muitos anos e que desde o meu primeiro contato com o SQL Server (SQL 2005) eu sempre me perguntei porque a Microsoft não implementava isso, pois facilitava e muito o dia a dia dos DBA’s e desenvolvedores.

Até a criação desse recurso, para procedures, functions, triggers e views era possível utilizar 3 comandos:
– CREATE
– ALTER
– DROP

Se o objeto em questão não existisse na base e você executasse o comando de ALTER, o SQL retornava uma mensagem de erro:

Se o objeto em questão existisse na base e você executasse o comando CREATE, o SQL também retornava uma mensagem de erro:

Então como que o DBA/Desenvolvedor fazia para evitar que essas mensagens de erro ocorressem durante a atualização de objetos ?

Se existe, apaga e depois cria

Uma forma de se garantir que a execução não retorne erro é verificando se o objeto existe na base e caso exista, faz a exclusão da view/procedure/function/trigger. Nesta solução, eu vejo dois grandes problemas:

  • O código do DROP precisa ser explicitamente declarado com o tipo do objeto (DROP VIEW, DROP FUNCTION, DROP PROCEDURE ou DROP TRIGGER), fazendo com que o nosso código não seja tão genérico
  • Ao apagar o objeto e recriá-lo logo em seguida, as permissões desse objeto são perdidas e os usuários que tinham acesso a esse objeto não terão mais. Para que isso não aconteça, você terá que salvar as permissões de cada objeto antes de apagá-lo e criá-lo novamente, o que pode gerar um trabalho muito grande dependendo da quantidade de objetos a serem alterados na base, além do risco e da responsabilidade de voltar todas as permissões, de todos os objetos. Para salvar as permissões, você pode utilizar o script que disponibilizei no post Verificando as permissões de um usuário no SQL Server.

Exemplo de uso:

Se não existe, cria e depois altera

Uma outra forma de garantir a criação/alteração de objetos sem erro, é com a solução que vou apresentar abaixo, onde eu verifico se o objeto existe e caso não exista, cria um objeto “vazio” e após isso, executa o comando ALTER com o código-fonte correto.

Essa solução é melhor que a anterior, pois ela não tem o problema da perda de permissão dos objetos, mas tem o mesmo problema do código não ser generalista, pois você precisará definir o tipo do objeto na instrução de criação do objeto “vazio” (CREATE VIEW, CREATE PROCEDURE, etc..)

Exemplo de uso:

CREATE OR ALTER

Recurso disponibilizado a partir do SQL Server 2016 SP1, agora é possível utilizar a instrução CREATE OR ALTER ao criar Stored Procedures, Functions, Views e Triggers. Ao fazer isso, o próprio SQL Server irá verificar se o objeto existe e irá criá-lo, caso não exista com o código-fonte informado ou realizar uma alteração no código, caso o objeto já exista.

Exemplo de uso:

Resultado:
Command(s) completed successfully.

É isso aí, pessoal.
Espero que tenham gostado desse post e até a próxima.

SQL, sql server, sql server 2008, sql server 2008 R2, Oracle, Oracle Database, Oracle 11g, Oracle 10g, Oracle 12c, MySQL, Firebird, Consultoria, Consultor, Programador, Programação. Desenvolvedor, Analista de Sistemas, DBA, Criação de website, Criação de Sistema Web, Vitória, Vila Velha, Guarapari, Espírito Santo, ES, Consultoria SQL em VItória, Treinamento, Curso, Prestação de serviço, prestar serviço, freelancer, freela, banco de dados, consultoria em banco de dados, consultor de banco de dados

2 Comments

  1. Show Dirceu como sempre, acompanho de perto o blog parabéns, me fez lembrar que eu usava tal recurso quando usava o Oracle em um certo projeto, fora que concordo plenamente como a Microsoft só foi implementar o recurso agora hahaha, mas são coisas da vida, valeu!

Deixe uma resposta