2014-08-27 3 views
1

Oracle 데이터베이스의 개발 환경에 스키마가 있습니다.스키마 이름을 상위 환경으로 변경

내 dev env 내 스키마 이름은 prabhu_order입니다. 그래서 상위 환경을 조성하기 위해 ddl을 사용할 때 prabhu_order.table1, prabhu_order.table2 ... 등과 같이 나타납니다.

상위 모든 환경에서 이것은 단지 ORDER입니다.

이제 스키마 이름을 바꾸려면 Ctrl 키를 대신 사용하고 있습니다. 나는 내가 50 ddls를 가지고있을 때 그것을하는 것이 두려워 ...

나는 스키마 이름을 변경하는 방법 suugest 나에게 suugest!

+0

dbms_metadata를 사용하여 DDL을 얻는 방법은 무엇입니까? –

+0

예 metadata.get_DDL 사용 – Prabhu

+2

'replace ('prabhu_order.', 'order.')'? – Ben

답변

3

replace을 사용하는 벤의 제안은 꽤 합리적이지만, 어떤 이유로 든 그렇게하고 싶지 않으면 프로그래밍 방식으로 할 수 있습니다. 단지 더 많은 작업과 코드 일뿐입니다.

dbms_metadata 패키지를 사용하여 DDL을 추출하면 set_remap_param 절차를 사용하여 DDL이 표시되는 방식을 수정할 수 있습니다. 그러나 기본 세션 핸들과 함께 작동하지 않는 것으로 보이는 ad hoc 쿼리에 사용하기가 쉽지 않습니다 (set_transform_param). 옵션 중 하나는 REMAP_SCHEMA이므로 데이터 펌프와 마찬가지로 DDL을 추출 할 때 스키마를 변경할 수 있습니다.

내가 더미 테이블을 작성하는 경우, 세션 수준에서 몇 가지 간단한 변환을 설정 한 다음 get_ddl 전화를 내가 얻을 : 분명히 내 스키마, STACKOVERFLOW을 가지고

create table t42(id number); 

begin 
    dbms_metadata.set_transform_param(
    transform_handle => DBMS_METADATA.SESSION_TRANSFORM, 
    name => 'PRETTY', value => FALSE); 
    dbms_metadata.set_transform_param(
    transform_handle => DBMS_METADATA.SESSION_TRANSFORM, 
    name => 'SEGMENT_ATTRIBUTES', value => FALSE); 
    dbms_metadata.set_transform_param(
    transform_handle => DBMS_METADATA.SESSION_TRANSFORM, 
    name => 'STORAGE', value => FALSE); 
    dbms_metadata.set_transform_param(
    transform_handle => DBMS_METADATA.SESSION_TRANSFORM, 
    name => 'SQLTERMINATOR', value => TRUE); 
end; 
/

select dbms_metadata.get_ddl('TABLE', 'T42') from dual; 

DBMS_METADATA.GET_DDL('TABLE','T42')           
-------------------------------------------------------------------------------- 

    CREATE TABLE "STACKOVERFLOW"."T42" ("ID" NUMBER) ;  

. PL/SQL 블록으로 내가 주문이를 다시 매핑 할 수 있습니다, 그리고 텍스트 검색하고 표시 할 수는 SQL * Plus를 VARIABLE을 사용하고 있습니다 : 그래서

variable c clob 

declare 
    l_handle number; 
    l_transform_handle number; 
begin 
    l_handle := dbms_metadata.open(object_type => 'TABLE'); 

    -- identify the object you want 
    dbms_metadata.set_filter(l_handle, 'SCHEMA', USER); 
    dbms_metadata.set_filter(l_handle, 'NAME', 'T42'); 

    -- set up a MODIFY transform and apply REMAP_SCHEMA to it 
    l_transform_handle := dbms_metadata.add_transform(handle => l_handle, 
    name => 'MODIFY'); 
    dbms_metadata.set_remap_param(transform_handle => l_transform_handle, 
    name => 'REMAP_SCHEMA', old_value => USER, new_value => 'ORDER'); 
    -- switch back from XML to DDL 
    l_transform_handle := dbms_metadata.add_transform(l_handle, 'DDL'); 

    -- set other 'pretty' transforms, to taste 
    dbms_metadata.set_transform_param(transform_handle => l_transform_handle, 
    name => 'PRETTY', value => FALSE); 
    dbms_metadata.set_transform_param(transform_handle => l_transform_handle, 
    name => 'SEGMENT_ATTRIBUTES', value => FALSE); 
    dbms_metadata.set_transform_param(transform_handle => l_transform_handle, 
    name => 'STORAGE', value => FALSE); 
    dbms_metadata.set_transform_param(transform_handle => l_transform_handle, 
    name => 'SQLTERMINATOR', value => TRUE); 

    :c := dbms_metadata.fetch_clob(handle => l_handle); 
    dbms_metadata.close(l_handle); 
end; 
/

을 지금 c 변수는 DDL은 보유 :

print c 

C 
--------------------------------------------- 

    CREATE TABLE "ORDER"."T42" ("ID" NUMBER) ; 

익명 블록 및 SQL * Plus 변수를 사용하는 대신 오브젝트 유형 및 오브젝트 이름을 사용하고 DDL을 CLOB로 리턴하는 함수로 변환 할 수 있습니다.

스키마를 지정하지 않는 것이 좋습니다. 스키마를 지정하지 않으면 소스 제어에 포함 시키거나 다른 환경에서 사용할 수 있습니다. 이를 수행하려면 null 대신 새 스키마를 전달하십시오.

dbms_metadata.set_remap_param(transform_handle => l_transform_handle, 
    name => 'REMAP_SCHEMA', old_value => USER, new_value => null); 

C 
------------------------------------- 

    CREATE TABLE "T42" ("ID" NUMBER) ; 
+0

[이 토론] (https://community.oracle.com/thread/1008491)은 전에이 접근법을 보았던 곳일 수 있습니다. 또한 기능 버전을 보여줍니다. –

+0

많은 감사, Alex! 교체시 Bob과 동의했지만 그 문제에 직면했습니다. 글쎄, 조금 길지 만 위험감은 없다. .. 다시 한번 감사드립니다. Stakeoverflow는 실제로 학습하고 성장할 수있는 플랫폼입니다. 좋은 작업을하십시오 :-) – Prabhu