Domanda

Alcuni dei trigger nel mio database non sono validi dopo determinati cambiamenti sulle tabelle.Ma sembra che stiano ancora lavorando.L'unico problema che ho è se uso lo sviluppatore SQL ci sono croci rosse sul lato sinistro dei trigger che indicano che non sono validi.È un grosso problema?

So che posso ricompilare il grilletto per risolverlo, ma non sono sicuro se questo è davvero un problema per preoccuparsi.Se è così, dovrò rivedere le mie precedenti centinaia di modifiche e scoprire cosa sta causando il problema.Grazie.

È stato utile?

Soluzione

Ogni volta che implementiamo una modifica in un oggetto del database qualsiasi codice che dipende da esso è invalidato. Ciò influenza i trigger, le visualizzazioni e le procedure memorizzate. Tuttavia, la prossima volta che qualcosa chiama quel codice il database lo ricompirà automaticamente.

Quindi non abbiamo bisogno di preoccuparsi di questo, giusto? Bene, sì, fino a un punto. La cosa è che l'invalidazione dei trigger (o qualsiasi cosa) è una bandiera per noi che è stato fatto un cambiamento che potrebbe influire sul funzionamento di tale trigger, che potrebbe avere effetti collaterali. L'effetto collaterale più ovvio è che il trigger non si compilerà. Più sottilmente, il trigger compila ma fallisce durante le operazioni.

Quindi, è una buona idea forzare la ricompilazione dei trigger in un ambiente di sviluppo, per garantire che il nostro cambiamento non abbia interrotto fondamentalmente nulla. Ma possiamo saltare quella fase quando implementiamo il nostro cambiamento nella produzione, perché lo facciamo così fiducioso che tutto ricompirà su richiesta. Dipende dal nostro nervo :)

Oracle fornisce meccanismi per ricompilare automaticamente tutti gli oggetti non validi in uno schema.

    .
  • Il più semplice è usare DBMS_UTILITY.COMPILE_SCHEMA(). Ma questo è stato doganoso dal 8i (perché il supporto per le procedure memorizzate Java ha introdotto il potenziale di dipendenze circolari) e non è più garantita di compilare tutti gli oggetti per la prima volta.

  • in 9i Oracle ci ha dato uno script $ORACLE_HOME/rdbms/admin/utlrp.sql che ricompilizzava le cose. Sfortunatamente richiede l'accesso Sysdba.

  • In 10G hanno aggiunto il pacchetto UTL_RECOMP, che fondamentalmente fa tutto ciò che lo fa lo script. Questo è l'approccio consigliato per ricompilare un gran numero di oggetti. Sfortunatamente richiede anche l'accesso sysdba. Scopri di più .

In 11G Oracle ha introdotto la gestione della dipendenza a grana fine. Ciò significa che le modifiche alle tabelle sono valutate a una granularità più fine (fondamentalmente livello colonna anziché livello di tabella), e solo gli oggetti direttamente interessati direttamente dalle modifiche sono interessate. Scopri di più .

Altri suggerimenti

Non è affatto un grosso problema.

Basta fare clic con il pulsante destro del mouse su di loro per ricompilare e sei bello andare ... sto scrivendo questo dalla mia esperienza.

Se ci sono errori con il codice che hai appena cambiato, appariranno in modo da poterlo aggiustare.Il compilatore ti dirà dove sono i problemi (numeri di linea, nomi variabili, ecc.) In caso di errori.

Se i trigger funzionano, allora è probabile che Oracle stia intrappolando un errore ORA-04068 quando accresce il trigger e riprovare il trigger dopo che è stato ricompilato automaticamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top