2010-06-04 19 views
10

J'ai créé un package Oracle PL/SQL avec un en-tête et un corps avec beaucoup de code. Plus tard, j'ai fini par effacer accidentellement le code de ce corps après avoir réexécuté l'instruction CREATE OR REPLACE PACKAGE BODY... avec un code source différent (que j'avais l'intention d'enregistrer sous un nom de paquet différent).Puis-je récupérer un ancien code source pl/sql Oracle à partir d'un corps de package après avoir remplacé par un nouveau code

Y at-il un moyen de récupérer mon ancien code source remplacé à partir du package?

+4

Qu'en est-il de CVS/etc? –

Répondre

4

Sauf si vous avez l'enregistrement/vérification des commandes DDL est activée, ou une sauvegarde de la base de données, alors la réponse est presque certainement pas

définitions de base de données, y compris les procédures stockées, doivent toujours être traités comme code source, et maintenu dans un référentiel de code

+3

Le contrôle de la source est un must sur tout le code, y compris les choses DB. De petits changements incrémentiels et des vérifications fréquentes sont la clé du bon développement du logiciel. –

+0

Merci pour vos commentaires - malheureusement, j'ai appris cela à la dure. En fait, j'ai presque réussi à enregistrer une copie papier du code en utilisant l'option "Export DDL" dans SQL Developer quand j'avais fini - mais quelque chose est venu et j'ai perdu la trace. Quoi qu'il en soit - cet épisode assure que je ne l'oublierai plus. – VVP

+0

Cela nous est arrivé à tous. –

15

Vous pourriez être en mesure de le récupérer en utilisant une requête de retour de flamme sur all_source.

par exemple. mon corps de package est actuellement à la version 2, l'exécution de cette requête en tant qu'utilisateur 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. 

Je sais que je changé ce soir vers 9h30 ce donc après la connexion en tant qu'utilisateur SYSDBA j'ai couru cette requête:

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. 

Vous trouverez plus d'informations sur le retour de flamme here. Tom Kyte démontre également comment utiliser flashback avec all_source here.

+0

Merci - J'ai essayé le premier un (sans l'horodatage) et il m'a donné le dernier code. Puis j'ai ajouté l'horodatage et j'ai obtenu l'erreur "privilèges insuffisants". Je l'enverrai à la dba qui pourra peut-être le faire pour moi. – VVP

+0

L'administrateur de base de données dit que "all_source n'est pas utilisable avec flashback". – VVP

+0

point votre DBA à ce lien de Tom Kyte: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:6135698985750#13932884772332 –