Como gerencio privilégios e funções de usuário em minha instância de banco de dados do Amazon RDS for Oracle?
Tenho uma instância de banco de dados Amazon Relational Database Service (Amazon RDS) executando Oracle. Quero saber o procedimento para gerenciar privilégios e funções de usuário para essa instância de banco de dados.
Breve descrição
Quando você cria uma instância de banco de dados do Amazon RDS for Oracle, o usuário primário padrão é criado e recebe o máximo de permissões de usuário na instância de banco de dados com algumas limitações. Use essa conta para qualquer tarefa administrativa, como criar contas de usuário adicionais no banco de dados. Como o Amazon RDS é um serviço gerenciado, os usuários SYS e SYSTEM não podem ser usados por padrão.
Para obter a lista de funções e privilégios concedidos ao usuário primário do Amazon RDS for Oracle, consulte Privilégios da conta de usuário primário.
Como o Amazon RDS é um serviço gerenciado, não são fornecidos os seguintes privilégios para a função de DBA:
- ALTERAR BANCO DE DADOS
- ALTERAR SISTEMA
- CRIAR QUALQUER DIRETÓRIO
- SOLTAR QUALQUER DIRETÓRIO
- CONCEDER QUALQUER PRIVILÉGIO
- CONCEDER QUALQUER FUNÇÃO
Para obter mais informações, consulte Limitações para privilégios do Oracle DBA.
Resolução
Para conceder privilégios a objetos SYS no Amazon RDS, use o procedimento do Amazon RDS rdsadmin.rdsadmin_util.grant_sys_object. O procedimento concede apenas privilégios que o usuário primário já tenha concedido por meio de uma função ou concessão direta.
Execute um comando semelhante ao seguinte para conceder privilégios SELECT no objeto V_$SQLAREA ao usuário EXAMPLE-USERNAME:
Faça login como o usuário primário do RDS e execute o seguinte procedimento:
EXECUTE rdsadmin.rdsadmin_util.grant_sys_object( p_obj_name => 'V_$SQLAREA',p_grantee => 'EXAMPLE-USERNAME', p_privilege => 'SELECT');
Execute um comando semelhante ao seguinte para conceder privilégios SELECT no objeto V_$SQLAREA ao usuário EXAMPLE-USERNAME com opção de concessão:
Observação: use maiúsculas para definir todos os valores de parâmetros a menos que você tenha criado o usuário com um identificador que diferencia maiúsculas de minúsculas.
EXECUTE rdsadmin.rdsadmin_util.grant_sys_object( p_obj_name => 'V_$SQLAREA',p_grantee => 'EXAMPLE-USERNAME', p_privilege => 'SELECT', p_grant_option => true);
Execute as seguintes consultas para conceder as funções SELECT_CATALOG_ROLE and EXECUTE_CATALOG_ROLE ao usuário EXAMPLE-USERNAME com a opção admin. Com essas funções, EXAMPLE-USERNAME pode conceder acesso a objetos SYS que foram concedidos a SELECT_CATALOG_ROLE e EXECUTE_CATALOG_ROLE.
SQL> GRANT SELECT_CATALOG_ROLE TO EXAMPLE-USERNAME WITH ADMIN OPTION; SQL> GRANT EXECUTE_CATALOG_ROLE TO EXAMPLE-USERNAME WITH ADMIN OPTION;
Execute as seguintes consultas para exibir as concessões associadas à função SELECT_CATALOG_ROLE:
SELECT type, owner, table_name, privilege, grantor, grantable FROM dba_tab_privs WHERE grantee = upper('SELECT_CATALOG_ROLE') UNION SELECT 'SYS' AS type, NULL as owner, NULL as table_name, privilege, NULL, admin_option AS grantable FROM dba_sys_privs WHERE grantee = upper('SELECT_CATALOG_ROLE') UNION SELECT 'ROLE' AS type, NULL AS owner, NULL AS table_name, granted_role AS privilege, NULL, admin_option AS grantable FROM dba_role_privs WHERE grantee = upper('SELECT_CATALOG_ROLE') ORDER BY type, owner, table_name, privilege;
Para obter mais informações, consulte Conceder privilégios SELECT ou EXECUTE para objetos SYS.
Para revogar privilégios em um único objeto, use o procedimento RDS rdsadmin.rdsadmin_util.revoke_sys_object.
Execute o seguinte comando para revogar privilégios SELECT no objeto V_$SQLAREA do usuário EXAMPLE-USERNAME:
EXECUTE rdsadmin.rdsadmin_util.revoke_sys_object( p_obj_name => 'V_$SQLAREA', p_revokee => 'EXAMPLE-USERNAME', p_privilege => 'SELECT');
Para obter mais informações, consulte Revogar privilégios SELECT ou EXECUTE em objetos SYS.
Use uma ou mais das seguintes opções de solução de problemas com base no seu caso de uso.
Redefinir os privilégios do usuário primário
Se você revogou as funções e os privilégios do usuário primário, poderá redefini-los alterando a senha do usuário primário da sua instância de banco de dados do RDS.
Conceder RDS_MASTER_ROLE a usuários não primários
A função RDS_MASTER_ROLE não pode ser concedida a usuários não primários. Essa função é criada por SYS por padrão quando a instância de banco de dados é criada. O RDS_MASTER_ROLE deve ser concedido somente ao usuário primário. Execute a seguinte consulta para listar os usuários que receberam o RDS_MASTER_ROLE:
SQL> SELECT * FROM sys.dba_role_privs WHERE granted_role = 'RDS_MASTER_ROLE';
A saída é semelhante à seguinte:
GRANTEE GRANTED_ROLE ADM DEL DEF COM INH -------- --------------- --- --- --- --- --- MASTER RDS_MASTER_ROLE NO NO YES NO NO SYS RDS_MASTER_ROLE YES NO YES YES YES
Você pode notar na resposta da consulta que o usuário primário não tem a opção admin. Portanto, a função RDS_MASTER_ROLE não pode ser concedida a nenhum outro usuário.
Para obter mais informações, consulte Conceder privilégios a usuários não primários.
Revogar privilégios concedidos a PUBLIC
Revogar privilégios PUBLIC para pacotes DBMS_* e UTL_* principais não é uma prática recomendada porque vários aplicativos Oracle são projetados para confiar nesses privilégios. Para obter mais informações, consulte MOSC Doc 247093.1. Os principais pacotes DBMS_* e UTL_* incluem UTL_TCP, UTL_HTTP, HTTPURITYPE, UTL_INADDR, UTL_SMTP, DBMS_LDAP, DBMS_LOB, UTL_FILE, DBMS_ADVISOR, DBMS_OBFUSCATION_TOOLKIT, DBMS_BACKUP_RESTORE, e DBMS_SYS_SQL.
Solução de problemas de erro ao criar uma função com senha
Suponha que você execute a seguinte consulta para criar uma função com senha e conceder privilégios usando o rdsadmin_util.grant_sys_object:
SQL> CREATE ROLE ROLE_NAME IDENTIFIED BY EXAMPLE-PASSWORD; SQL> EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBMS_JOB', 'ROLE_NAME');
Em seguida, você visualiza o seguinte erro:
ORA-20199: Error in rdsadmin_util.grant_sys_object. ORA-44001: invalid schema ORA-06512: at "RDSADMIN.RDSADMIN_UTIL", line 268 ORA-44001: invalid schema
Para resolver esse problema, crie uma função sem uma senha.
-- Create a role without a password ALTER ROLE ROLE_NAME NOT IDENTIFIED;
Solução de problemas do erro ORA-01031: privilégios insuficientes
A seguir estão alguns exemplos de casos de uso em que você pode visualizar esse erro:
Você executou a consulta ALTER SYSTEM. Por exemplo, a seguinte consulta falha com o erro ORA-01031:
SQL> ALTER SYSTEM SET processes=200 scope=spfile;
Em vez disso, você pode modificar os valores de parâmetros em um grupo de parâmetros de banco de dados personalizado. No entanto, você não pode alterar os valores dos parâmetros em um grupo de parâmetros do banco de dados padrão.
Você está usando um acionador de banco de dados e suas alterações na estrutura da tabela subjacente fizeram com que o status do acionador se tornasse INVÁLIDO. Na próxima vez que o acionador for disparado, você poderá notar que a compilação implícita do acionador falhará com o seguinte erro:
ORA-04045: errors during recompilation/revalidation of SCOTT.ERROR_LOG_TRIG ORA-01031: insufficient privileges
Para corrigir esse problema, conceda o privilégio de administração do acionador do banco de dados ao proprietário do acionador explicitamente. Esse privilégio é necessário para alterar o acionador do banco de dados com êxito:
SQL> GRANT ADMINISTER DATABASE TRIGGER TO example-owner; SQL> ALTER TRIGGER example-owner.log_errors_trig COMPILE; Trigger altered.
Você executou um procedimento armazenado. Você visualiza esse erro ao executar um procedimento armazenado, porque os privilégios adquiridos com o uso de funções não funcionam em procedimentos armazenados nomeados que são executados com os direitos do definidor. Esses privilégios funcionam no SQL Plus e em blocos PL/SQL anônimos.
Exemplo:
SQL> CREATE USER EXAMPLE-USERNAME IDENTIFIED BY EXAMPLE-PASSWORD; SQL> GRANT connect, resource TO EXAMPLE-USERNAME -- Connect as EXAMPLE-USERNAME SQL> CREATE TABLE dept (deptno NUMBER, deptname VARCHAR2(30)); Table DEPT created. -- Drop the table and try to create the same table using the stored procedure. When you run the procedure, you get the error ORA-01031. SQL> DROP table DEPT; SQL> CREATE OR REPLACE PROCEDURE test_proc AS BEGIN EXECUTE IMMEDIATE 'CREATE TABLE DEPT (DeptNo number, DeptName varchar2(30))'; END; / Procedure TEST_PROC created SQL> EXEC TEST_PROC Error report - ORA-01031: insufficient privileges
Para corrigir esse problema, conecte-se como usuário primário e conceda os privilégios necessários explicitamente.
Exemplo:
-- Connect as master user and grant the CREATE TABLE privilege. SQL> GRANT CREATE TABLE TO test_user; -- Connect as EXAMPLE-USERNAME SQL> EXEC TEST_PROC PL/SQL procedure successfully completed.
O usuário primário não recebe os privilégios com a opção de concessão. Você pode visualizar esse erro quando as seguintes condições forem verdadeiras:
- O usuário primário não recebe um determinado privilégio em um objeto com a opção de concessão.
- O usuário primário tenta conceder esse privilégio a outro usuário.
Para corrigir esse problema, conceda os privilégios necessários explicitamente ao usuário primário com a opção de concessão.
Exemplo:
SQL> SHOW USER; USER is "EXAMPLE-USERNAME" SQL> SELECT * FROM SYS.DBA_TABLESPACE_USAGE_METRICS; ERROR: ORA-04043: object "SYS"."DBA_TABLESPACE_USAGE_METRICS" does not exist -- Grant fails on the object DBA_TABLESPACE_USAGE_METRICS because master user is not granted the SELECT privilege on DBA_TABLESPACE_USAGE_METRICS with the grant option. SQL> SHOW USER; USER is "ADMIN" SQL> GRANT SELECT ON SYS.DBA_TABLESPACE_USAGE_METRICS to EXAMPLE-USERNAME; GRANT SELECT ON SYS.DBA_TABLESPACE_USAGE_METRICS to EXAMPLE-USERNAME * ERROR at line 1: ORA-01031: insufficient privileges SQL> EXECUTE rdsadmin.rdsadmin_util.grant_sys_object( p_obj_name => 'DBA_TABLESPACE_USAGE_METRICS', p_grantee => 'ADMIN', p_privilege => 'SELECT', p_grant_option => true); SQL> GRANT SELECT ON SYS.DBA_TABLESPACE_USAGE_METRICS to EXAMPLE-USERNAME; -- After the privileges are granted, connect to EXAMPLE-USERNAME and then query DBA_TABLESPACE_USAGE_METRICS. SQL> SELECT * FROM SYS.DBA_TABLESPACE_USAGE_METRICS;
Informações relacionadas
Documentação da Oracle para Configurar privilégios e autorizações de função

Conteúdo relevante
- AWS OFICIALAtualizada há 9 meses
- AWS OFICIALAtualizada há um ano
- AWS OFICIALAtualizada há 2 anos
- AWS OFICIALAtualizada há um ano