2015-11-24 18 views
13

Tôi tạo một gói để tạo DDL đối tượng trong lược đồ của tôi (bạn phân tích tên đối tượng và trả về clob với DDL), vì vậy tôi có thể tạo tệp và đặt chúng thẳng vào SVN.Cách tạo dbms_metadata.get_ddl đẹp hơn/hữu ích

Tôi đang sử dụng dbms_metadata.get_ddl và nó hoạt động tốt cho tất cả các đối tượng ngoại trừ các bảng/lượt xem vật hoá.

Nếu tôi tạo ra một bảng như:

create table stackoverflow 
    (col_1 varchar2(64) 
    , col_2 number 
    , col_3 date); 

create index idx_test on stackoverflow(col_1); 

alter table stackoverflow add constraint ui_test unique (col_2) using index; 

Và tạo DDL với:

begin 
    dbms_output.put_line(dbms_metadata.get_ddl(object_type => 'TABLE' 
              , name => 'STACKOVERFLOW') 
         ); 
end; 

Nó cung cấp cho chúng tôi:

CREATE TABLE "TEST_SCHEMA"."STACKOVERFLOW" 
( "COL_1" VARCHAR2(64), 
    "COL_2" NUMBER, 
    "COL_3" DATE, 
    CONSTRAINT "UI_TEST" UNIQUE ("COL_2") 
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
STORAGE(INITIAL 131072 NEXT 131072 MINEXTENTS 1 MAXEXTENTS 2147483645 
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
TABLESPACE "USERS_DATA_TS" ENABLE 
) SEGMENT CREATION IMMEDIATE 
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
NOCOMPRESS LOGGING 
STORAGE(INITIAL 131072 NEXT 131072 MINEXTENTS 1 MAXEXTENTS 2147483645 
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
TABLESPACE "USERS_DATA_TS" 

Để thực hiện tất cả các chỉ số có liên quan, chúng tôi có thể sử dụng:

begin 
    dbms_output.put_line(dbms_metadata.get_dependent_ddl(object_type => 'INDEX' 
                 , base_object_name => 'STACKOVERFLOW')); 
end; 

phải có:

CREATE INDEX "TEST_SCHEMA"."IDX_TEST" ON "MF"."STACKOVERFLOW" ("COL_1") 
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
STORAGE(INITIAL 131072 NEXT 131072 MINEXTENTS 1 MAXEXTENTS 2147483645 
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
TABLESPACE "USERS_DATA_TS" 
CREATE UNIQUE INDEX "TEST_SCHEMA"."UI_TEST" ON "MF"."STACKOVERFLOW" ("COL_2") 
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
STORAGE(INITIAL 131072 NEXT 131072 MINEXTENTS 1 MAXEXTENTS 2147483645 
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
TABLESPACE "USERS_DATA_TS" 

Tôi muốn tạo ra một tập tin có chứa: tạo bảng, hạn chế, chỉ số, trợ cấp (để có một tập tin với tất cả các định nghĩa cần thiết) và sử dụng dbms_metadata có vẻ không thể cho tôi để làm .

vấn đề của tôi với sản lượng là:

  1. đúp kép của tên

  2. tên Schema bên trong DDL làm cho chúng ta khó có thể biên dịch DDL cùng qua nhiều schemas. Để khắc phục điều đó chúng ta cần phải tạo ra một số cho các regex hoặc thêm một cái gì đó như sau có thể khắc phục điều đó:

    dbms_metadata.SET_REMAP_PARAM(dbms_metadata.SESSION_TRANSFORM,'REMAP_SCHEMA','TEST_SCHEMA',''); 
    

    nhưng bạn phải thêm như 8 dòng:

    hOpenOrig0 := DBMS_METADATA.OPEN('TABLE'); 
    DBMS_METADATA.SET_FILTER(hOpenOrig0,'NAME',p_object_name); 
    DBMS_METADATA.SET_FILTER(hOpenOrig0,'SCHEMA',get_table.owner); 
    tr := dbms_metadata.add_transform(hOpenOrig0, 'MODIFY'); 
    hTransDDL := DBMS_METADATA.ADD_TRANSFORM(hOpenOrig0,'DDL'); 
    dbms_metadata.set_remap_param(tr, name => 'REMAP_SCHEMA', old_value => user, new_value => ''); 
    get_package_spec.ddl := DBMS_METADATA.FETCH_CLOB(hOpenOrig0); 
    DBMS_METADATA.CLOSE(hOpenOrig0); 
    
  3. Không có cách nào của các ràng buộc trích xuất (sử dụng các chỉ mục) và các chỉ mục cùng một lúc. Bạn không thể ghép nối đầu ra vì định nghĩa lặp lại của ui_test. Có tùy chọn để loại bỏ các ràng buộc từ get_ddl nhưng chúng tôi đang mất ràng buộc/kiểm tra.

  4. Làm thế nào PL/SQL Developer tạo ra sản lượng

    -- Create table 
    create table STACKOVERFLOW 
    (
        col_1 VARCHAR2(64), 
        col_2 NUMBER, 
        col_3 DATE 
    ) 
    tablespace USERS_DATA_TS 
        pctfree 10 
        pctused 40 
        initrans 1 
        maxtrans 255 
        storage 
        (
        initial 128K 
        next 128K 
        minextents 1 
        maxextents unlimited 
        pctincrease 0 
    ); 
    -- Create/Recreate indexes 
    create index IDX_TEST on STACKOVERFLOW (COL_1) 
        tablespace USERS_DATA_TS 
        pctfree 10 
        initrans 2 
        maxtrans 255 
        storage 
        (
        initial 128K 
        next 128K 
        minextents 1 
        maxextents unlimited 
        pctincrease 0 
    ); 
    -- Create/Recreate primary, unique and foreign key constraints 
    alter table STACKOVERFLOW 
        add constraint UI_TEST unique (COL_2) 
        using index 
        tablespace USERS_DATA_TS 
        pctfree 10 
        initrans 2 
        maxtrans 255 
        storage 
        (
        initial 128K 
        next 128K 
        minextents 1 
        maxextents unlimited 
        pctincrease 0 
    ); 
    

Có ai biết một cách để tạo ra sản lượng tương tự như PL/SQL Developer? Tôi đoán họ đã tạo một số trình phân tích cú pháp XML là dbms_metadata.get_xml) để tạo ra một phiên bản đẹp hơn (thụt lề, trật tự, tất cả ở nơi tốt, sẵn sàng biên dịch ở bất kỳ đâu).

Tất nhiên tôi có thể chơi với regexes hoặc user_indexes nhưng đó không phải là vấn đề.

ps. DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'PRETTY',true); là một định nghĩa lạ là "đẹp".

+0

bạn có thể loại bỏ các tiền tố schema sử dụng dbms_metadata.set_transform_param - có một lá cờ để không hiển thị hoặc để remap schema TEST_SCHEMA null. PL/SQL Developer không sử dụng dbms_metadata để tạo DDL, vì vậy không có dấu ngoặc kép ở đó. – thatjeffsmith

Trả lời

-2

Tôi có thể đề xuất bạn sử dụng expdp/impdp cho mục đích xuất ddl.

Lược đồ xuất: faydin với expdp sau.

expdp userid=faydin/***** directory=ORA_TMP_DIR reuse_dumpfiles=y content=METADATA_ONLY exclude=STATISTICS schemas=faydin dumpfile=metadata.dmp

Nhận DDL trong ddl.sql cho user : faydin remapped as: faydin3 với impdp

schema nhập

impdp userid=faydin/***** directory=ORA_TMP_DIR dumpfile=metadata.dmp sqlfile=ddl.sql remap_schema=faydin:faydin3

để db bằng cách xóa sqlfile=ddl.sql cụm từ trong lệnh impdp.

7

dbms_metadata.get_dll lấy đối tượng oracle dưới dạng xml và tiếp theo biến đổi nó thành xslt thành tập lệnh ddl.

Danh sách bảng hữu ích select table_name from all_tables where table_name like 'META%'.

  1. METASTYLESHEET - Các bản đồ một stylesheet để tên của nó

  2. METAXSL $ - Các bản đồ một XMLTAG tên stylesheet - liên kết này vào bảng 1

  3. MetaView $ - bản đồ một loại đối tượng để một XMLTAG - liên kết bảng này với bảng thứ hai
  4. METAXSLPARAM $ - bảng tra cứu cho các bộ lọc biến đổi có sẵn cho từng loại đối tượng và loại chuyển đổi.

Đối với một oracle bảng sử dụng kutable cho xml để DDL cho một oracle chỉ số sử dụng kuindex ... vv

Bằng cách đặt các thông số có thể thay đổi hành vi của chuyển đổi. Để tìm thông số hữu ích, hãy kiểm tra bảng METAXSLPARAM $ hoặc tìm kiếm nó trong tài liệu bảng định kiểu. EMIT_SCHEMA - tôi đã tìm thấy trong kucommon XSLT

EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'EMIT_SCHEMA',false); --undocumented remove schema 
EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SEGMENT_CREATION',false); --undocumented remove segement creation 
EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'CONSTRAINTS_AS_ALTER',true); 
select dbms_metadata.get_ddl(object_type => 'TABLE' , name => 'STACKOVERFLOW') from dual; 
+0

Thực sự hữu ích. Để chắc chắn nó giải quyết một phần vấn đề của tôi (''EMIT-SCHEMA'') mà tôi đã sửa với' regexp' ... Nó không hoàn toàn giải quyết vấn đề của tôi nhưng tôi sẽ xem xét tất cả các tham số –

+0

Thật không may là không có gì thực sự thú vị ngoài của emit-schema ... Điều tra nhiều hơn tôi tìm thấy nhiều vấn đề hơn với get_dll ... Tôi nghĩ rằng tôi sẽ phải nâng cao một số vé thẳng đến Oracle –

+0

Cũng lưu ý rằng 'SEGMENT_CREATION' dường như không còn có sẵn với 12i (ném một lỗi ở đây). Hơn nữa tôi bỏ lỡ 'COMMENT ON' với' get_ddl' - cộng với nó kích thích nhiều câu lệnh ('CREATE TABLE'…' ALTER TABLE') được tạo ra với 'CONSTRAINTS_AS_ALTER', nhưng không được phân tách đúng cách (không tìm thấy dấu chấm phẩy đơn). Có một tham số khác bị thiếu, như 'dbms_metadata.set_transform_param (dbms_metadata.session_transform, 'SQLTERMINATOR', true);'? ;) – Izzy

Các vấn đề liên quan