Erros de usuários já existentes em bancos de dados Oracle ao usar Data Pump em PDBs e CDBs
- CloudDB
- 8 de mai. de 2023
- 2 min de leitura
Algumas vezes acontecem erros durante a importação do Data Pump, no exemplo a seguir, devido a um usuário pré-criado: ORA-31684: Tipo de objeto USER: "XYZ" já existe.
Frequentemente, é necessário saber antecipadamente, antes da criação, as funções e privilégios necessários para esse usuário. Ou seja, o que conceder ao usuário antes da importação!
Aqui está como extrair todas essas informações com um único comando, que cria um script para executar as funções e privilégios necessários. Vamos supor que o usuário se chame JOHN:
select 'grant '||GRANTED_ROLE||' to JOHN;' from DBA_ROLE_PRIVS where grantee = 'JOHN'
union all
select 'grant '||PRIVILEGE||' to JOHN;' from DBA_SYS_PRIVS where grantee = 'JOHN'
union all
select 'grant '||PRIVILEGE||' on '||GRANTOR||'.'||TABLE_NAME||' to JOHN;' from DBA_TAB_PRIVS where grantee = 'JOHN';
Como você pode ver, todas as informações podem ser encontradas e extraídas das tabelas DBA_ROLE_PRIVS, DBA_SYS_PRIVS e DBA_TAB_PRIVS.
Observe que você precisa executar esse comando no PDB onde o usuário local está. Se você executá-lo no CDB, provavelmente obterá "nenhuma linha selecionada".
Caso você não tenha acesso DBA por algum motivo, modifique as consultas acima para visualizar os privilégios apenas para o usuário atual. Para isso, consulte as versões USER_ das mesmas tabelas DBA_ e execute as consultas como usuário atual.
Aqui está outro exemplo que mostra que as coisas nem sempre são tão simples:
Suponha que eu tenha uma role chamada HACKER que já foi concedida à role DBA.
SQL> grant HACKER to DBA;
Essa não aparece nas visualizações acima. Isso ocorre porque as visualizações de privilégios DBA_ exibem apenas os GRANTEES com acesso atribuído diretamente. Note que a role HACKER é herdada de outra role. Bem, não se preocupe - ela será concedida indiretamente. Essas roles não são exibidas nessas visualizações.
A consulta select * from dba_role_roles; mostrará quais roles foram concedidas às roles.
Além disso, lembre-se de extrair o perfil do usuário e as cotas do tablespace antes de pré-criar o usuário. Utilize as tabelas DBA_TS_QUOTAS e DBA_PROFILES. E não se esqueça da senha!
Comments