2010-06-28 14 views
7

Đây là vấn đề của tôi, tôi muốn tạo một đường cơ sở trên Dateabase phát triển (Oracle 10g), và kiểm tra svn để kiểm soát phiên bản. để giúp chúng tôi quản lý các thay đổi cơ sở dữ liệu gia tăng.Bất kỳ công cụ nào để xuất toàn bộ Oracle DB thành tập lệnh SQL

Vấn đề của tôi là tôi nên tạo đường cơ sở của Oracle 10g như thế nào? cơ sở dữ liệu giờ đây bao gồm hơn 500 bảng, với số lượng lớn dữ liệu cấu hình và tôi muốn cơ sở dữ liệu db của tôi dựa trên tập lệnh SQL được đặt để kiểm tra vào phiên bản lật đổ, thay vì sau đó kiểm tra trong bãi chứa của Oracle ..

Tôi đã thử sử dụng liquibase generateChangeLog, nhưng nó có một số vấn đề hiệu suất .. bất cứ ai cũng có thể giới thiệu cho tôi bất kỳ công cụ nào sẽ giúp tôi 1. Quét bất kỳ Lược đồ Oracle 2. Tạo một tập hợp các tập lệnh SQL (Với cấu trúc bảng và dữ liệu) ..

Cảm ơn trước

James!

Trả lời

4

Something như

SELECT DBMS_METADATA.GET_DDL('TABLE',table_name) FROM USER_TABLES; 

là một khởi đầu tốt. Bạn có thể tinh chỉnh nó với PL/SQL và UTL_FILE để làm cho nó ghi mỗi bảng vào một tệp khác. Bạn có thể sẽ cần phải làm chuỗi quá (mặc dù phiên bản chúng là khá vô nghĩa), và có thể gây nên/thủ tục/chức năng/gói vv.

Đừng quên tài trợ.

+0

bạn có thể sử dụng PL/SQL và truy vấn này để xuất khẩu DDL vào một tập tin trên các mặt hàng? –

+0

Máy chủ DB không thể ghi tệp khách hàng (trừ khi bạn gặp rắc rối khi chia sẻ và gắn ổ đĩa, làm cho máy khách tệp có hiệu quả). –

1

Bạn đã thử công cụ SQLDeveloper miễn phí của Oracle chưa? Nó cung cấp cho bạn khả năng xuất DDL và dữ liệu.

2

EXPDP với CONTENT = tùy chọn METADATA_ONLY, sau đó IMPDP với SQLFILE = your_script.sql?

Nicolas.

3

Giải pháp tổng quát hơn sẽ là đổ DDL sql cho danh sách bảng được chọn, nhưng ngoài ra còn có các loại đối tượng khác. Điều này có thể được thực hiện bằng cách sử dụng all_objects và all_users views.

Ví dụ rằng làm việc cho tôi:

select dbms_metadata.GET_DDL(u.object_type,u.object_name, u.owner) 
from all_objects u 
where 1=1 
-- filter only selected object types 
and u.object_type in ('TABLE', 'INDEX', 'FUNCTION', 'PROCEDURE', 'VIEW', 
         'TYPE', 'TRIGGER', 'SEQUENCE') 
-- don't want system objects, generated, temp, invalid etc. 
and u.object_name not like 'SYS_%' 
and temporary!='Y' 
and generated!='Y' 
and status!='INVALID' 
and u.object_name not like 'TMP_%' 
and u.object_name not like '%$%' 

-- if you want to filter only changed from some date/timestamp: 
-- and u.last_ddl_time > '2014-04-02' 

-- filter by owner 
and owner in (
    select username from dba_USERS where DEFAULT_TABLESPACE not like 'SYS%' 
    and username not in ('ORACLE_OCM') 
    and username not like '%$%' 
) 
; 

Tôi đã viết một kịch bản python mà làm mới schema db trong gia tăng chế độ dựa trên sql tương tự:

  • chạy SQL với last_ddl_time> = tối đa (last_ddl_time từ lần làm mới cuối cùng)
  • tại cửa hàng cuối last_ddl_time ở đâu đó trong hệ thống tệp để làm mới tiếp theo

Tài liệu tham khảo:

  1. oracle dbms_metadata.GET_DDL chức năng
  2. oracle all_objects xem