Toute tentative d'affectation des rôles EXP_FULL_DATABASE ou IMP_FULL_DATABASE à un utilisateur pour une instance de base de données Oracle Amazon RDS échoue avec les messages d'erreur suivants :

ERROR at line 1:

ORA-00604: error occurred at recursive SQL level 1

ORA-20997: "EXP_FULL_DATABASE" grants not allowed

ORA-06512: at "RDSADMIN.RDSADMIN", line 63

ORA-06512: at line 2

Ces messages d'erreur ne s'affichent pas lors de l'affectation de rôles à des utilisateurs Oracle en dehors d'Amazon RDS.

Il n'est pas possible d'affecter les rôles EXP_FULL_DATABASE et IMP_FULL_DATABASE dans RDS et cette action n'est pas recommandée, car ces rôles comportent des privilèges qui doivent être réservés aux administrateurs de base de données. Exécutez la requête suivante pour vérifier la puissance de ces rôles :

SQL> select substr(grantee,1,15) grantee, privilege from dba_sys_privs where grantee in ('IMP_FULL_DATABASE','EXP_FULL_DATABASE') order by grantee;

Un cas d'utilisation courant pour l'affectation de ces rôles est l'autorisation d'exporter et d'importer des objets entre les schémas.

Solution 1

Demandez à un utilisateur DBA tel que l'utilisateur principal d'effectuer les opérations d'exportation et d'importation. Cette procédure convient aux exportations et importations manuelles, mais elle n'est pas recommandée pour les travaux automatisés en raison des puissantes autorisations du rôle DBA.

Solution 2

Demandez à chaque propriétaire d'un schéma d'exporter ou d'importer les objets de son propre schéma. Cette solution est préférable, car elle évite d'accorder à l'utilisateur des autorisations sur « TOUTE » table. Les exemples suivants illustrent trois méthodes utilisées pour exporter les objets en tant propriétaire du schéma d'origine et les importer dans le nouveau schéma en tant que propriétaire du nouveau schéma.

Autorisations de base de données pour la solution 2

Accordez les autorisations à l'ancien et au nouveau propriétaires comme illustré. Ces autorisations fonctionnent avec toutes les implémentations de la solution ci-après.

Configuration de SOURCEDB :

Création de old_owner dans SOURCEDB :

SOURCEDB> create user old_owner identified by pwd default tablespace users;

SOURCEDB> grant connect, resource to old_owner;

SOURCEDB> grant read,write on directory DATA_PUMP_DIR to old_owner;

SOURCEDB> grant execute on dbms_datapump to old_owner; -- on-prem you have to connect as SYS

SOURCEDB> grant execute on dbms_file_transfer to old_owner; -- on-prem you have to connect as SYS

SOURCEDB> alter user old_owner quota unlimited on users;

Création d'une table de démonstration, dont le propriétaire est old_owner, avec laquelle s'entraîner :

SOURCEDB> create table old_owner.mytab (x number) tablespace users;

Configuration de TARGETDB :

TARGETDB> create user old_owner identified by pwd default tablespace users;

TARGETDB> grant connect, resource to old_owner;

TARGETDB> grant read,write on directory DATA_PUMP_DIR to old_owner;

TARGETDB> create user new_owner identified by pwd default tablespace users;

TARGETDB> grant connect, resource to new_owner;

TARGETDB> grant create table to new_owner;

TARGETDB> grant read,write on directory DATA_PUMP_DIR to new_owner;

TARGETDB> grant execute on dbms_datapump to new_owner;

TARGETDB> alter user new_owner quota unlimited on users;

Implémentation 1 de la solution 2 : utilisation des utilitaires exp/imp Oracle d'origine :

$ exp old_owner/pwd@sourcedb file=mytab.dmp tables=mytab

$ imp new_owner/pwd@targetdb file=mytab.dmp fromuser=old_owner touser=new_owner

Implémentation 2 de la solution 2 : utilisation de datapump avec l'interface o/s expdp/impdp :

$ expdp old_owner/pwd@sourcedb directory='DATA_PUMP_DIR' dumpfile=mytab.dmp tables=mytab

Instructions dbms_file_transfer

Si sourcedb et targetdb sont identiques, vous pouvez ignorer toutes les instructions dbms_file_transfer.

Consultez la documentation Oracle pour plus d'informations sur la création d'un lien de base de données public ou privé nommé « targetdblink ».

SOURCEDB> show user -- should be OLD_OWNER

SOURCEDB> select * from dual@targetdblink ; -- this test must be successful before proceeding

SOURCEDB> alter session set global_names=false; -- in case you need to get past error "ORA-02085: database link X connects to Y"

SOURCEDB>

BEGIN

    DBMS_FILE_TRANSFER.PUT_FILE(

    source_directory_object                        => 'DATA_PUMP_DIR',

    source_file_name                               => 'mytab.dmp',

    destination_directory_object                   => 'DATA_PUMP_DIR',

    destination_file_name                          => 'mytab.dmp',

    destination_database                           => 'targetdblink'

    );

FIN;

/

Fin des instructions dbms_file_transfer

$ impdp new_owner/pwd@targetdb directory='DATA_PUMP_DIR' dumpfile=mytab.dmp full=y remap_schema=old_owner:new_owner

Implémentation 3 de la solution 2 : utilisation de la procédure in-database DBMS_DATAPUMP:

SOURCEDB> show user    -- should be OLD_OWNER

DECLARE

    h1 NUMBER;

BEGIN

    h1 := DBMS_DATAPUMP.OPEN(operation=>'EXPORT', job_mode=>'SCHEMA',     job_name=>'OLD_OWNER_EXP2');

    DBMS_DATAPUMP.ADD_FILE (

        handle=>h1,

        filename=>'mytab.dmp',

        directory=>'DATA_PUMP_DIR',

        filetype=>dbms_datapump.ku$_file_type_dump_file,

        reusefile=>1);

    DBMS_DATAPUMP.METADATA_FILTER(h1,'SCHEMA_EXPR', 'IN(''OLD_OWNER'')');

    DBMS_DATAPUMP.start_job(h1)

FIN;

/

Insérez les instructions dbms_file_transfer ici

TARGETDB> show user    -- should be NEW_OWNER

DECLARE

    h1 NUMBER;

BEGIN

    h1:= DBMS_DATAPUMP.OPEN(operation=>'IMPORT', job_mode=>'SCHEMA',     job_name=>'NEW_OWNER_IMP2');

        DBMS_DATAPUMP.ADD_FILE (

        handle=>h1,

        filename=>'mytab.dmp',

        directory=>'DATA_PUMP_DIR',

        filetype=>dbms_datapump.ku$_file_type_dump_file

);

    DBMS_DATAPUMP.METADATA_REMAP(handle=>h1, name=>'REMAP_SCHEMA',

    old_value=>'OLD_OWNER',value=>'NEW_OWNER');

    DBMS_DATAPUMP.start_job(h1);

FIN;

/

Amazon RDS, Oracle, ORA-20997, dbms_file_transfer, expdp/impdp, exp/imp, EXP_FULL_DATABASE, IMP_FULL_DATABASE, ORA-00604, ORA-06512, grants not allowed, DBMS_DATAPUMP


Cette page vous a-t-elle été utile ? Oui | Non

Retour au Centre de connaissances AWS Support

Vous avez besoin d'aide ? Consultez le site du Centre AWS Support

Date de publication : 25/08/2016