MSS utilise "base de données" pour faire référence à plusieurs concepts différents dans Oracle. Je pense que vous voulez peut-être dire que vous voulez exporter un schéma et le réimporter dans la même base de données Oracle avec un nom de schéma différent. J'utiliserais normalement datapump à partir de la ligne de commande pour cela (expdp/impdp). Cependant, there is a datapump API que vous pouvez utiliser pour le faire à partir d'un shell SQL.
-- export
declare
l_dp_handle NUMBER;
BEGIN
l_dp_handle := DBMS_DATAPUMP.open('EXPORT','SCHEMA',null,'MY_EXPORT','LATEST');
DBMS_DATAPUMP.add_file(l_dp_handle,'my_export.dmp','DATA_PUMP_DIR');
DBMS_DATAPUMP.add_file(l_dp_handle,'my_export.log','DATA_PUMP_DIR',null,DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE);
DBMS_DATAPUMP.metadata_filter(l_dp_handle,'SCHEMA_EXPR','= ''OLD_SCHEMA_NAME''');
DBMS_DATAPUMP.start_job(l_dp_handle);
DBMS_DATAPUMP.detach(l_dp_handle);
END;
/
-- check status with:
select * from dba_datapump_jobs;
-- import
declare
l_dp_handle NUMBER;
BEGIN
l_dp_handle := DBMS_DATAPUMP.open('IMPORT','SCHEMA',null,'MY_IMPORT','LATEST');
DBMS_DATAPUMP.add_file(l_dp_handle,'my_export.dmp','DATA_PUMP_DIR');
DBMS_DATAPUMP.add_file(l_dp_handle,'my_export.imp.log','DATA_PUMP_DIR',null,DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE);
DBMS_DATAPUMP.metadata_filter(l_dp_handle,'SCHEMA_EXPR','= ''OLD_SCHEMA_NAME''');
DBMS_DATAPUMP.metadata_remap(l_dp_handle,'REMAP_SCHEMA','OLD_SCHEMA_NAME','NEW_SCHEMA_NAME');
DBMS_DATAPUMP.start_job(l_dp_handle);
DBMS_DATAPUMP.detach(l_dp_handle);
END;
/
Notez que vous aurez besoin de privilèges DBA si vous souhaitez importer dans un schéma autre que le vôtre. Votre utilisateur Oracle aura également besoin de privilèges de lecture/écriture sur le répertoire (DATA_PUMP_DIR dans cet exemple), d'exécution de privilèges sur DBMS_DATAPUMP, etc.
Je * pense * c'est exactement ce que je veux. Je vais l'essayer. – Darrien
Pour la première ligne add_file, on me dit que je donne une valeur d'argument invalide. C'est ce que je fais: DBMS_DATAPUMP.ADD_FILE (l_dp_handle, '{dbBackup.ToLower()}. Dmp', '{DbDumpDir}'); où dbBackup est le nom de la sauvegarde et DbDumpDir est un chemin d'accès au vidage de la base de données. Une idée quelle erreur je fais? – Darrien
@Damien - vous devez transmettre le nom d'un objet de répertoire Oracle, pas un chemin de répertoire du système d'exploitation. Regardez dans 'all_directories' pour voir si vous avez accès à tout. Vous pouvez avoir besoin de privilèges supplémentaires (pour cela, et pour créer le nouvel utilisateur). –