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à:
đúp kép của tên
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);
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.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".
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