No MySQL, se eu tiver um esquema myschema
e um gatilho chamado mytriggername
, posso soltar um gatilho como segue
DROP TRIGGER IF EXISTS myschema.mytriggername
De qualquer forma, não consigo encontrar nos documentos do DB2 para a instrução DROP nenhuma contrapartida para a DROP TRIGGER IF EXISTS
instrução? Alguma sugestão?
Outra maneira de fazer isso é um
FOR
loop executando apenasDROP
instruções para objetos que existem. É francamente um exagero para um único objeto, mas é útil ao lidar com um monte de esquemas. Por exemplo:Eu usei truques semelhantes em uma rotina DROP_SCHEMA anos atrás (link da fonte na parte inferior da página), embora seja redundante agora.
O truque acima também pode ser usado para atualizações condicionais de "apenas os objetos que existem" e/ou "apenas os objetos que não existem".
Para a criação de esquema real, eu geralmente preferia manter um script de criação "limpo" (sem coisas condicionais) e um script "soltar" separado para limpar as coisas. Se isso soa como fazer um trabalho redundante para você mesmo, existem alguns truques que podem ser empregados para gerar o script de descarte a partir do script de criação (use
tac
para reverter o script de instalação e um pouco de mágica regex para converterCREATE
instruções emDROP
; isso significa ser vagamente disciplinado em como você formata seu SQL, a menos que você queira que os regexes fiquem realmente confusos).Você pode criar um procedimento que ignore o erro gerado se você descartar um gatilho inexistente:
Você pode chamar o procedimento como:
A solução de longo prazo é usar uma versão para o(s) banco(s) de dados e ignorar todas as versões que já estão lá. Cada commit cria uma nova versão, em rollback de erro para que você nunca acabe entre as versões. Escusado será dizer que você precisa impedir todas as operações ddl fora desse processo.