Gostaria de saber qual é a melhor prática para recompilar objetos programáveis do Oracle 10g que se tornam inválidos devido a alterações em um deles.
Para ser mais específico, tenho alguns pacotes que usam tipos de nível de esquema. Também tenho gatilhos no sistema que chamam funções/procedimentos de pacotes. Pelo que entendi, alterações no corpo do pacote não requerem nenhuma ação adicional (exceto a recompilação do corpo). No entanto, se eu alterar package , tenho que recompilar vários gatilhos que usam este pacote e outros pacotes que dependem dele.
Até agora, apenas peguei a lista de objetos inválidos e os recompilei ou usei DBMS_UTILITY.compile_schema.
Obrigada.
O truque é recompilar os pacotes e o código dependente de uma só vez. Se você estiver atualizando um banco de dados de desenvolvimento com novos dados, terá uma lista enorme de procedimentos inválidos. Além disso, com o código dependente, você se recompila continuamente. Você pode usar este comando localizado em $ORACLE_HOME/rdbms/admin/utlrcmp.sql:
(disponível a partir de 9i, mas melhorado para 10g e 11)
Se você tiver pacotes que não são válidos e não serão válidos, por qualquer motivo, você pode usar este pacote de Martin Mares que irá compilar recursivamente todos os objetos inválidos, exceto aqueles que você especificar.
No que diz respeito às melhores práticas, tento limitar a cadeia de dependência. É sempre um lance entre "Não se repita", que incentiva dependências e ter pacotes independentes.
Minha regra geral é que, se o pacote/gatilho/objeto interagir com outro banco de dados, tente reduzir as dependências; portanto, se houver um problema, você terá menos locais para procurar as origens do problema.