Quelqu'un peut-il me dire comment générer le DDL pour toutes les tables, vues, index, packages, procédures, fonctions, déclencheurs, types, séquences, synonymes, autorisations, etc. dans un schéma Oracle? Idéalement, j'aimerais également copier les lignes, mais c'est moins important.
Je souhaite effectuer cette opération sur un travail planifié, et non manuellement à chaque fois, afin d'éviter l'utilisation de l'assistant dans SQL Developer.
Idéalement, étant donné que j'exécuterai ceci sur plusieurs schémas qui ont des octrois et des synonymes, j'aimerais pouvoir faire une recherche/remplacement dans la sortie afin que les noms de schéma correspondent à ceux de mes nouveaux schémas. être.
Merci!
Vous pouvez spouler le schéma dans un fichier via SQL * Plus et le package dbms_metadata. Remplacez ensuite le nom du schéma par un autre via sed. Cela fonctionne pour Oracle 10 et supérieur.
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',
'CREDENTIAL', 'PROCOBJ',
'CHAIN', 'PROCOBJ',
'PROGRAM', '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',
'XML SCHEMA', 'XMLSCHEMA',
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
Mettez tout dans un script et exécutez-le via cron (planificateur). L'exportation d'objets peut être délicate lorsque des fonctionnalités avancées sont utilisées. Ne soyez pas surpris si vous avez besoin d'ajouter quelques exceptions supplémentaires au code ci-dessus.
Si vous voulez générer individuellement ddl pour chaque objet,
Les requêtes sont:
- - GENERATE DDL POUR TOUS LES OBJETS UTILISATEURS
- 1. POUR TOUTES LES TABLEAUX
SELECT DBMS_METADATA.GET_DDL('TABLE', TABLE_NAME) FROM USER_TABLES;
- 2. POUR TOUS LES INDEX
SELECT DBMS_METADATA.GET_DDL('INDEX', INDEX_NAME) FROM USER_INDEXES WHERE INDEX_TYPE ='NORMAL';
- 3. POUR TOUTES LES VUES
SELECT DBMS_METADATA.GET_DDL('VIEW', VIEW_NAME) FROM USER_VIEWS;
OR
SELECT TEXT FROM USER_VIEWS
- 4. POUR TOUTES LES VUES MATERILISEES
SELECT QUERY FROM USER_MVIEWS
- 5. POUR TOUTES LES FONCTIONS
SELECT DBMS_METADATA.GET_DDL('FUNCTION', OBJECT_NAME) FROM USER_PROCEDURES WHERE OBJECT_TYPE = 'FUNCTION'
=============================================== ===========================================
GET_DDL La fonction ne prend pas en charge certains types d'objet tels que LOB, VUE MATERIALIZED, PARTITION DE TABLE
SO, requête consolidée pour générer DDL sera:
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;
Il existe un problème avec des objets tels que 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');
La procédure get_ddl pour un PACKAGE renverra à la fois le corps de la spécification AND et il sera donc préférable de modifier la requête sur les all_objects afin que les corps du package ne soient pas renvoyés à la sélection.
Jusqu'à présent, j'ai changé la requête en ceci:
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;
Bien que d'autres modifications puissent être nécessaires en fonction des types d'objet que vous obtenez ...
Commencez par exporter les métadonnées du schéma:
expdp dumpfile=filename logfile=logname directory=dir_name schemas=schema_name
puis importez en utilisant l'option sqlfile
(il n'importera pas de données, il écrira simplement le schéma DDL dans ce fichier)
impdp dumpfile=filename logfile=logname directory=dir_name sqlfile=ddl.sql
Pour générer le script DDL pour un schéma entier [~ # ~] [~ # ~] , c'est-à-dire un [~ # ~] utilisateur [~ # ~] , vous pouvez utiliser dbms_metadata.get_ddl .
Exécutez le script suivant dans SQL * Plus créé par Tim Hall :
Indiquez le nom d'utilisateur lorsque vous y êtes invité.
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