Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

O gatilho é inválido no Oracle


Sempre que implantamos uma alteração em um objeto de banco de dados, qualquer código que dependa dele é invalidado. Isso afeta gatilhos, exibições e procedimentos armazenados. No entanto, da próxima vez que algo chamar esse código, o banco de dados o recompilará automaticamente.

Então não precisamos nos preocupar com isso, certo? Bem, sim, até certo ponto. O problema é que a invalidação dos gatilhos (ou o que quer que seja) é um sinalizador para nós de que foi feita uma alteração que pode afetar a operação desse gatilho, o que pode ter efeitos colaterais. O efeito colateral mais óbvio é que o gatilho não compila. Mais sutilmente, o gatilho compila, mas falha durante as operações.

Portanto, é uma boa ideia forçar a recompilação de gatilhos em um ambiente de desenvolvimento, para garantir que nossa mudança não tenha quebrado nada fundamentalmente. Mas podemos pular essa etapa quando implantarmos nossa alteração na produção, porque estamos confiantes de que tudo será recompilado sob demanda. Depende do nosso nervo :)

O Oracle fornece mecanismos para recompilar automaticamente todos os objetos inválidos em um esquema.

  • O mais simples é usar DBMS_UTILITY.COMPILE_SCHEMA() . Mas isso tem sido desonesto desde o 8i (porque o suporte para Java Stored Procedures introduziu o potencial para dependências circulares) e não é mais garantido para compilar todos os objetos com sucesso na primeira vez.

  • Em 9i a Oracle nos deu um script $ORACLE_HOME/rdbms/admin/utlrp.sql que recompilou as coisas. Infelizmente, requer acesso SYSDBA.

  • No 10g eles adicionaram o pacote UTL_RECOMP, que basicamente faz tudo o que aquele script faz. Essa é a abordagem recomendada para recompilar um grande número de objetos. Infelizmente, também requer acesso SYSDBA. Saiba mais .

No 11g, a Oracle introduziu o gerenciamento de dependências refinado. Isso significa que as alterações nas tabelas são avaliadas em uma granularidade mais fina (basicamente no nível da coluna em vez do nível da tabela) e somente os objetos que são diretamente afetados pelas alterações são afetados. Saiba mais .