2012-06-04 7 views
40

Может ли кто-нибудь сказать мне, как я могу генерировать DDL для всех таблиц, представлений, индексов, пакетов, процедур, функций, триггеров, типов, последовательностей, синонимов, грантов и т. Д. Внутри схемы Oracle? В идеале я хотел бы также скопировать строки, но это менее важно.Как сгенерировать весь DDL схемы Oracle (скриптовый)?

Я хочу сделать это в запланированной задаче какого-то типа, а не вручную каждый раз, чтобы исключить использование мастера в SQL Developer.

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

Спасибо!

+0

SQL Developer может сделать это через интерфейс командной строки, поэтому это возможно, если вы хотите пройти этот маршрут. – thatjeffsmith

+0

Простой запуск: SELECT DBMS_METADATA.get_ddl (object_Type, object_name, owner) FROM ALL_OBJECTS WHERE OWNER = 'OWNER_NAME'; –

ответ

48

Вы можете отправить схему в файл через пакет SQL * Plus и dbms_metadata. Затем замените имя схемы на другое с помощью sed. Это работает для Oracle 10 и выше.

sqlplus<<EOF 
set long 100000 
set head off 
set echo off 
set pagesize 0 
set verify off 
set feedback off 
spool schema.out 

select dbms_metadata.get_ddl(object_type, object_name, owner) 
from 
(
    --Convert DBA_OBJECTS.OBJECT_TYPE to DBMS_METADATA object type: 
    select 
     owner, 
     --Java object names may need to be converted with DBMS_JAVA.LONGNAME. 
     --That code is not included since many database don't have Java installed. 
     object_name, 
     decode(object_type, 
      'DATABASE LINK',  'DB_LINK', 
      'JOB',    'PROCOBJ', 
      'RULE SET',   'PROCOBJ', 
      'RULE',    'PROCOBJ', 
      'EVALUATION CONTEXT', 'PROCOBJ', 
      'PACKAGE',   'PACKAGE_SPEC', 
      'PACKAGE BODY',  'PACKAGE_BODY', 
      'TYPE',    'TYPE_SPEC', 
      'TYPE BODY',   'TYPE_BODY', 
      'MATERIALIZED VIEW', 'MATERIALIZED_VIEW', 
      'QUEUE',    'AQ_QUEUE', 
      'JAVA CLASS',   'JAVA_CLASS', 
      'JAVA TYPE',   'JAVA_TYPE', 
      'JAVA SOURCE',  'JAVA_SOURCE', 
      'JAVA RESOURCE',  'JAVA_RESOURCE', 
      object_type 
     ) object_type 
    from dba_objects 
    where owner in ('OWNER1') 
     --These objects are included with other object types. 
     and object_type not in ('INDEX PARTITION','INDEX SUBPARTITION', 
      'LOB','LOB PARTITION','TABLE PARTITION','TABLE SUBPARTITION') 
     --Ignore system-generated types that support collection processing. 
     and not (object_type = 'TYPE' and object_name like 'SYS_PLSQL_%') 
     --Exclude nested tables, their DDL is part of their parent table. 
     and (owner, object_name) not in (select owner, table_name from dba_nested_tables) 
     --Exclude overflow segments, their DDL is part of their parent table. 
     and (owner, object_name) not in (select owner, table_name from dba_tables where iot_type = 'IOT_OVERFLOW') 
) 
order by owner, object_type, object_name; 

spool off 
quit 
EOF 

cat schema.out|sed 's/OWNER1/MYOWNER/g'>schema.out.change.sql 

Поместите все в сценарий и запустите его через cron (scheduler). Экспорт объектов может быть сложным при использовании дополнительных функций. Не удивляйтесь, если вам нужно добавить еще несколько исключений из приведенного выше кода.

+1

Как насчет грантов? – eisberg

+0

Все обернуто чем-то вроде 80 символов, хотя у меня есть линия, равная 32767. Любой способ исправить это? – Superdooperhero

4

Существует проблема с такими объектами, как PACKAGE_BODY:

SELECT DBMS_METADATA.get_ddl(object_Type, object_name, owner) FROM ALL_OBJECTS WHERE OWNER = 'WEBSERVICE'; 


ORA-31600 invalid input value PACKAGE BODY parameter OBJECT_TYPE in function GET_DDL 
ORA-06512: на "SYS.DBMS_METADATA", line 4018 
ORA-06512: на "SYS.DBMS_METADATA", line 5843 
ORA-06512: на line 1 
31600. 00000 - "invalid input value %s for parameter %s in function %s" 
*Cause: A NULL or invalid value was supplied for the parameter. 
*Action: Correct the input value and try the call again. 



SELECT DBMS_METADATA.GET_DDL(REPLACE(object_type,' ','_'), object_name, owner) 
    FROM all_OBJECTS 
    WHERE (OWNER = 'OWNER1'); 
+0

Кажется, что вы что-то на что-то, но это может помочь расширить «проблему» с помощью PACKAGE_BODY и поместить код SQL в аккуратный маленький блок кода. –

+0

Вам нужно заменить пробелы для подчеркивания. Попробуйте запустить: «SELECT DBMS_METADATA.get_ddl (replace (object_Type, '', '_'), object_name, owner) FROM ALL_OBJECTS WHERE OWNER = 'WEBSERVICE'; – wind39

+0

мое сообщение было точно об этом – v0devil

4

Процедура get_ddl для пакета будет возвращать как спецификации и тела, так что это будет лучше изменить запрос на ALL_OBJECTS поэтому пакет органов не возвращаются при выборе.

До сих пор я изменил запрос к этому:

SELECT DBMS_METADATA.GET_DDL(REPLACE(object_type, ' ', '_'), object_name, owner) 
FROM all_OBJECTS 
WHERE (OWNER = 'OWNER1') 
and object_type not like '%PARTITION' 
and object_type not like '%BODY' 
order by object_type, object_name; 

Хотя другие изменения могут потребоваться в зависимости от типов объектов, которые вы получаете ...

2

первого экспорта метаданные схемы, а затем импорт, используя SQLFILE вариант (он не будет импортировать данные только он будет писать DDL из схемы для этого файла)

пример: - expdp dumpfile=filename logfile=logname directory=dir name schemas=schema name

username:/ as sysdba

impdp dumpfile=filename logfile=logname directory=dir sqlfile=sql.log

username:/ as sysdba

3

Если вы хотите индивидуально генерировать DDL для каждого объекта,

Запросы являются:

--generate DDL для всех пользователей ОБЪЕКТОВ

- 1. ДЛЯ ВСЕХ ТАБЛИЦЫ

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

--2.ДЛЯ ВСЕХ ПОКАЗАТЕЛЕЙ

SELECT DBMS_METADATA.GET_DDL('INDEX', INDEX_NAME) FROM USER_INDEXES WHERE INDEX_TYPE ='NORMAL'; 

--3. ДЛЯ ВСЕХ МНЕНИЙ

SELECT DBMS_METADATA.GET_DDL('VIEW', VIEW_NAME) FROM USER_VIEWS; 

ИЛИ

SELECT TEXT FROM USER_VIEWS 

--4. ДЛЯ ВСЕХ MATERILIZED ВИДОМ

SELECT QUERY FROM USER_MVIEWS 

--5. ДЛЯ ВСЕХ ФУНКЦИЙ

SELECT DBMS_METADATA.GET_DDL('FUNCTION', OBJECT_NAME) FROM USER_PROCEDURES WHERE OBJECT_TYPE = 'FUNCTION' 

======================================= ================================================== ======

GET_DDL Функция поддержки оленья кожа в течение некоторого object_type как LOB, MATERIALIZED VIEW, ТАБЛИЦА PARTITION

SO, Consolidated запрос для генерации DDL будет:

SELECT OBJECT_TYPE, OBJECT_NAME,DBMS_METADATA.GET_DDL(OBJECT_TYPE, OBJECT_NAME, OWNER) 
    FROM ALL_OBJECTS 
    WHERE (OWNER = 'XYZ') AND OBJECT_TYPE NOT IN('LOB','MATERIALIZED VIEW', 'TABLE PARTITION') ORDER BY OBJECT_TYPE, OBJECT_NAME; 
+1

выберите dbms_metadata.get_ddl ('MATERIALIZED_VIEW', 'MVIEW_NAME') из dual; работает –

1

Чтобы создать сценарий DDL для всего SCHEMA т.е. USER, вы можете использовать dbms_metadata.get_ddl.

Выполните следующий скрипт в SQL * Plus созданный Tim Hall:

Предоставлять в имя пользователя при запросе.

set long 20000 longchunksize 20000 pagesize 0 linesize 1000 feedback off verify off trimspool on 
column ddl format a1000 

begin 
    dbms_metadata.set_transform_param (dbms_metadata.session_transform, 'SQLTERMINATOR', true); 
    dbms_metadata.set_transform_param (dbms_metadata.session_transform, 'PRETTY', true); 
end; 
/

variable v_username VARCHAR2(30); 

exec:v_username := upper('&1'); 

select dbms_metadata.get_ddl('USER', u.username) AS ddl 
from dba_users u 
where u.username = :v_username 
union all 
select dbms_metadata.get_granted_ddl('TABLESPACE_QUOTA', tq.username) AS ddl 
from dba_ts_quotas tq 
where tq.username = :v_username 
and rownum = 1 
union all 
select dbms_metadata.get_granted_ddl('ROLE_GRANT', rp.grantee) AS ddl 
from dba_role_privs rp 
where rp.grantee = :v_username 
and rownum = 1 
union all 
select dbms_metadata.get_granted_ddl('SYSTEM_GRANT', sp.grantee) AS ddl 
from dba_sys_privs sp 
where sp.grantee = :v_username 
and rownum = 1 
union all 
select dbms_metadata.get_granted_ddl('OBJECT_GRANT', tp.grantee) AS ddl 
from dba_tab_privs tp 
where tp.grantee = :v_username 
and rownum = 1 
union all 
select dbms_metadata.get_granted_ddl('DEFAULT_ROLE', rp.grantee) AS ddl 
from dba_role_privs rp 
where rp.grantee = :v_username 
and rp.default_role = 'YES' 
and rownum = 1 
union all 
select to_clob('/* Start profile creation script in case they are missing') AS ddl 
from dba_users u 
where u.username = :v_username 
and u.profile <> 'DEFAULT' 
and rownum = 1 
union all 
select dbms_metadata.get_ddl('PROFILE', u.profile) AS ddl 
from dba_users u 
where u.username = :v_username 
and u.profile <> 'DEFAULT' 
union all 
select to_clob('End profile creation script */') AS ddl 
from dba_users u 
where u.username = :v_username 
and u.profile <> 'DEFAULT' 
and rownum = 1 
/

set linesize 80 pagesize 14 feedback on trimspool on verify on 
Смежные вопросы