Eu tenho que escrever um script de implantação que funcione se um procedimento armazenado existir ou não. ou seja, se existir, preciso alterá-lo, caso contrário, criá-lo.
Como posso fazer isso no sql.
Estou usando o SQL Server 2005
sql
sql-server-2005
stored-procedures
GordyII
fonte
fonte
Respostas:
Se você soltar e criar o procedimento, perderá as configurações de segurança. Isso pode incomodar seu DBA ou interromper completamente seu aplicativo.
O que faço é criar um procedimento armazenado trivial, se ainda não existir. Depois disso, você pode ALTERAR o procedimento armazenado ao seu gosto.
Dessa forma, as configurações de segurança, os comentários e outras meta deta sobreviverão à implantação.
fonte
if object_id('YourSp') is null BEGIN ... END
para adicionar as permissões apropriadas após a criação do procedimento armazenado.A maneira mais limpa é testar sua existência, descartá-la, se existir, e depois recriá-la. Você não pode incorporar uma instrução "create proc" dentro de uma instrução IF. Isso deve fazer bem:
fonte
Se você estiver lidando apenas com procedimentos armazenados, a coisa mais fácil a fazer é provavelmente largar o proc e depois recriá-lo. Você pode gerar todo o código para fazer isso usando o assistente para gerar scripts no SQL Server.
fonte
Desde
SQL Server 2016 CTP3
que você pode usar novas DIE declarações em vez de grandesIF
embalagensSintaxe:
Inquerir:
Mais informações aqui
fonte
onde
xxx
é o nome do procfonte
Além do que já foi dito, também gosto de adicionar uma abordagem diferente e advogar o uso da estratégia de implantação de scripts diferenciais. Em vez de criar um script com estado que sempre verifique o estado atual e atue com base nesse estado, implante por meio de uma série de scripts sem estado que são atualizados a partir de versões conhecidas . Eu usei essa estratégia e vale muito a pena, pois meus scripts de implantação agora estão todos 'SE' livres.
fonte
Você pode escrever uma consulta da seguinte maneira:
Para ser mais específico na sintaxe acima:
OBJECT_ID é um número de identificação exclusivo para um objeto no banco de dados, usado internamente pelo SQL Server. Como estamos passando o ProcedureName seguido pelo seu tipo de objeto P, que informa ao SQL Server que você deve encontrar o objeto chamado ProcedureName, que é do tipo procedure, ou seja, P
Esta consulta encontrará o procedimento e, se estiver disponível, descartará e criará um novo.
Para informações detalhadas sobre OBJECT_ID e tipos de objeto, visite: SYS.Objects
fonte
fonte
Eu tenho um procedimento armazenado que permite ao cliente estender a validação; se existir, não quero alterá-lo; se não, quero criá-lo, da melhor maneira que encontrei:
fonte
O código abaixo verificará se o procedimento armazenado já existe ou não.
Se existir, ele será alterado, se não existir, criará um novo procedimento armazenado para você:
fonte
Uma opção melhor pode ser usar uma ferramenta como o Red-Gate SQL Compare ou o SQL Examiner para comparar automaticamente as diferenças e gerar um script de migração.
fonte