2010-06-04 54 views
10

Avevo creato un pacchetto Oracle PL/SQL con un'intestazione e un corpo con un sacco di codice.Posso recuperare il vecchio codice sorgente pl/sql Oracle da un corpo del pacchetto dopo che ho sostituito con il codice più nuovo

Successivamente, ho finito per cancellare accidentalmente il codice da quel corpo dopo aver eseguito nuovamente l'istruzione CREATE OR REPLACE PACKAGE BODY... con un diverso codice sorgente (che in realtà intendevo salvare con un nome di pacchetto diverso).

C'è un modo per recuperare il mio vecchio codice sorgente sostituito dal pacchetto?

+4

Che dire di CVS/etc? –

risposta

4

meno che non hanno la registrazione/auditing di comandi DDL abilitato, o di un backup del database, allora la risposta è quasi certamente non

definizioni di database, tra cui le stored procedure, dovrebbe sempre essere trattati come codice sorgente, e mantenuta in un repository di codice

+3

Il controllo del codice sorgente è obbligatorio su qualsiasi codice, compresi i file DB. Piccole modifiche incrementali e frequenti check-in sono fondamentali per assicurare lo sviluppo del software. –

+0

Grazie per i vostri commenti - sfortunatamente l'ho imparato nel modo più duro. In realtà, mi sono quasi liberato di salvare una copia del codice utilizzando l'opzione "Esporta DDL" in SQL Developer quando avevo finito - ma qualcosa è venuto fuori e ho perso traccia di esso. Ad ogni modo - questo episodio mi assicura che non lo dimenticherò più. – VVP

+0

È successo a tutti noi. Ci sono solo 2 tipi di persone: quelli che fanno i backup/usano il controllo del codice sorgente e quelli che non hanno mai avuto una perdita di dati –

15

Potrebbe essere possibile recuperarlo utilizzando una query di ritorno su all_source.

ad es. il mio corpo pacchetto è attualmente alla versione 2, che esegue la query come utente standard:

SQL> select text 
    2 from all_source 
    3 where name = 'CARPENTERI_TEST' 
    4 and type = 'PACKAGE BODY'; 

TEXT 


package body carpenteri_test 
is 

procedure do_stuff 
is 
begin 
    dbms_output.put_line('version 2'); 
end do_stuff; 

end carpenteri_test; 

10 rows selected. 

So che ho cambiato questo intorno alle 9:30 di questa sera così dopo il collegamento come utente SYSDBA mi sono imbattuto questa query:

SQL> select text 
    2 from all_source 
    3 as of timestamp 
    4 to_timestamp('04-JUN-2010 21:30:00', 'DD-MON-YYYY HH24:MI:SS') 
    5 where name = 'CARPENTERI_TEST' 
    6 and type = 'PACKAGE BODY'; 

TEXT 
---------------------------------------------------------------------------- 

package body carpenteri_test 
is 

procedure do_stuff 
is 
begin 
    dbms_output.put_line('version 1'); 
end do_stuff; 

end carpenteri_test; 

10 rows selected. 

Ulteriori informazioni sul flashback possono essere trovate here. Tom Kyte illustra anche come utilizzare il flashback con all_source here.

+0

Grazie - Ho provato il primo uno (senza timestamp) e mi ha dato l'ultimo codice. Poi ho aggiunto il timestamp e ho ricevuto l'errore "privilegi insufficienti". Lo inoltrerò al dba che può forse farlo per me. – VVP

+0

Il DBA afferma che "all_source non è utilizzabile con flashback". – VVP

+0

indirizza il tuo DBA a questo collegamento da Tom Kyte: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::1111QUESTION_ID:6135698985750#13932884772332 –