2014-08-27 4 views
1

У меня есть схема в моей среде разработки в базе данных Oracle.Изменение имени схемы в более высоких средах

В моем dev env мое имя схемы называется prabhu_order. Поэтому, когда я получаю ddl для продвижения верхней среды, он приходит как prabhu_order.table1, prabhu_order.table2 ... и т. Д.

Во всех моих более высоких средах это просто ЗАКАЗ.

Теперь я выполняю замену ctrl, чтобы изменить имя схемы. Я боюсь делать это, когда у меня есть 50 ддд ...

Пожалуйста, примите меня за изменение названия схемы!

+0

Как вы получаете DDL с dbms_metadata? –

+0

Да, используя metadata.get_DDL – Prabhu

+2

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

ответ

3

Предложение Бена использовать replace кажется довольно разумным, но если вы не хотите этого делать, по какой-то причине вы можете сделать это программно - это скорее больше работы и больше кода.

Поскольку вы используете пакет dbms_metadata для извлечения DDL, вы можете использовать процедуру set_remap_param, чтобы изменить способ представления DDL; но не так просто использовать для специального запроса как set_transform_param, поскольку он, похоже, не работает с дескриптором сеанса по умолчанию. Один из вариантов: REMAP_SCHEMA, поэтому вы можете изменить схему при извлечении DDL, как с насосом данных.

Если создать фиктивную таблицу, установить некоторые простые преобразования на уровне сеанса, а затем вызвать get_ddl я получаю:

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) ;  

который, очевидно, имеет свою схему, STACKOVERFLOW. С/блок 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

Большое спасибо, Алекс! Согласился с Бобом на замену, но я столкнулся с некоторыми проблемами с этим. Ну, это немного длинный, но я не чувствую риска. Еще раз спасибо. Stakeoverflow действительно является платформой для изучения и роста. Поднимайте хорошую работу :-) – Prabhu