2010-06-04 26 views
10

Tôi đã tạo gói Oracle PL/SQL với tiêu đề và nội dung có nhiều mã.Tôi có thể khôi phục mã nguồn Oracle pl/sql cũ hơn từ phần thân gói sau khi tôi đã thay thế bằng mã mới hơn

Sau đó, tôi vô tình xóa mã khỏi cơ thể đó sau khi chạy lại câu lệnh CREATE OR REPLACE PACKAGE BODY... với mã nguồn khác (thực tế tôi dự định lưu dưới tên gói khác).

Có cách nào để tôi có thể khôi phục mã nguồn cũ được thay thế của mình từ gói không?

+4

Còn CVS/etc thì sao? –

Trả lời

4

Trừ khi bạn đã đăng nhập/kiểm toán các lệnh DDL kích hoạt, hoặc một bản sao lưu cơ sở dữ liệu, thì câu trả lời là gần như chắc chắn không

định nghĩa cơ sở dữ liệu, bao gồm các thủ tục lưu trữ, nên luôn luôn bị đối xử như mã nguồn, và duy trì trong kho lưu trữ mã

+3

Kiểm soát nguồn là phải trên bất kỳ và tất cả mã, bao gồm cả công cụ DB. Thay đổi gia tăng nhỏ và đăng ký thường xuyên là chìa khóa để phát triển phần mềm mượt mà chắc chắn. –

+0

Cảm ơn ý kiến ​​của bạn - tiếc là tôi đã học được điều này một cách khó khăn. Trên thực tế, tôi gần như đã tiết kiệm được một bản sao của mã bằng cách sử dụng tùy chọn "Export DDL" trong SQL Developer khi tôi đã hoàn thành - nhưng một cái gì đó đã xuất hiện và tôi đã mất dấu nó. Dù sao - tập này đảm bảo tôi sẽ không quên nó nữa. – VVP

+0

Nó đã xảy ra với tất cả chúng ta. Chỉ có 2 loại người: những người thực hiện sao lưu/sử dụng kiểm soát nguồn và những người chưa bao giờ mất dữ liệu –

15

Bạn có thể lấy lại bằng cách sử dụng truy vấn flashback trên all_source.

ví dụ: cơ thể gói của tôi hiện đang ở phiên bản 2, thực hiện truy vấn này như một người dùng chuẩn:

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. 

Tôi biết tôi đã thay đổi này khoảng 9:30 tối nay nên sau khi kết nối như một người dùng SYSDBA Tôi chạy truy vấn này:

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. 

Thông tin thêm về hồi tưởng có thể được tìm thấy here. Tom Kyte cũng demostrates cách sử dụng flashback với all_source here.

+0

Cảm ơn - Tôi đã thử một (w/o dấu thời gian) và nó đã cho tôi mã mới nhất. Sau đó, tôi đã thêm dấu thời gian và có lỗi "không đủ đặc quyền". Sẽ chuyển tiếp nó cho dba người có thể có thể làm điều đó cho tôi. – VVP

+0

DBA nói rằng "all_source không thể sử dụng được với flashback". – VVP

+0

chỉ cho DBA của bạn liên kết này từ Tom Kyte: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:6135698985750#13932884772332 –