DEFAULT ROLE

open ac DEFAULT ROLEProporcionado por necessidades distintas de aplicação, segurança e até mesmo alterações incorretas ou desnecessárias é comum nos depararmos com usuários de banco de dados que contenham roles de forma não default (DEFAULT_ROLE = NO).

*Muitos casos com roles não default são constatados quando liberamos uma role a um usuário e ele retorna informando que ainda não possui as permissões esperadas pela role, ao verificar nos deparamos com DEFAULT_ROLE = NO na DBA_ROLE_PRIVS.

SQL> select granted_role, default_role from dba_role_privs where grantee='EXEMPLO';

GRANTED_ROLE                   DEF
------------------------------ ---
CONNECT                        YES
RESOURCE                       NO

Quando uma role não é uma DEFAULT ROLE, para que o usuário possa utilizar das permissões a ela atribuídas é preciso “habilitá-la” utilizando o comando SET ROLE.

set role DEFAULT ROLE

As roles’s são ajustadas de modo DEFAULT ou NÃO DEFAULT através do comando ALTER USER conforme imagem abaixo:

alter user role DEFAULT ROLE

Quando criamos um usuário, implicitamente ele contém um DEFAULT ROLE ALL, ou seja, as roles atribuídas a este usuário serão automaticamente DEFAULT ROLE (DEFAULT_ROLE = YES). Contudo se um “alter user default role” for executado e a role for alterada de ALL, as novas roles atribuídas ao usuário serão automaticamente não default o que nos submete ao caso apresentado acima(*) do usuário que contem a role mas não consegue utilizar as permissões.

Para identificarmos estes casos onde uma nova role concedida será NÃO DEFAULT podemos utilizar a SYS.USER$

A coluna DEFROLE da SYS.USER$ representa um “status geral” das roles podendo ser 0, 1 ou 2 conforme abaixo:

0 – Nenhuma. As roles atribuídas ao usuário são todas NÃO DEFAULT. Este valor é setado através de um “ALTER USER <username> DEFAULT ROLE NONE”

SQL> create user exemplo identified by exemplo;

User created.

SQL> grant connect, resource to exemplo;

Grant succeeded.

SQL> select name, defrole from sys.user$ where name='EXEMPLO';

NAME                              DEFROLE
------------------------------ ----------
EXEMPLO                                 1

SQL> alter user exemplo default role none;

User altered.

SQL> select name, defrole from sys.user$ where name='EXEMPLO';

NAME                              DEFROLE
------------------------------ ----------
EXEMPLO                                 0

SQL> select granted_role, default_role from dba_role_privs where grantee='EXEMPLO';

GRANTED_ROLE                   DEF
------------------------------ ---
CONNECT                        NO
RESOURCE                       NO

1 – As roles atribuidas ao usuários serão sempre DEFAULT ROLE(padrão de criação do usuário). Este valor é setado através de um “ALTER USER <username> DEFAULT ROLE ALL”

SQL> alter user exemplo default role all;

User altered.

SQL> select name, defrole from sys.user$ where name='EXEMPLO';

NAME                              DEFROLE
------------------------------ ----------
EXEMPLO                                 1

SQL> select granted_role, default_role from dba_role_privs where grantee='EXEMPLO';

GRANTED_ROLE                   DEF
------------------------------ ---
CONNECT                        YES
RESOURCE                       YES

2 – Aponta que existem roles específicas com DEFAULT ROLE (YES). As novas roles concedidas serão sempre NÃO DEFAULT, se precisa ser DEFAULT necessita ser ajustada. Este valor é setado através de um “ALTER USER <username> DEFAULT ROLE <role_name>”

SQL> alter user exemplo default role connect;

User altered.

SQL> select name, defrole from sys.user$ where name='EXEMPLO';

NAME                              DEFROLE
------------------------------ ----------
EXEMPLO                                 2

SQL> select granted_role, default_role from dba_role_privs where grantee='EXEMPLO';

GRANTED_ROLE                   DEF
------------------------------ ---
CONNECT                        YES
RESOURCE                       NO

SQL> grant dba to exemplo;

Grant succeeded.

SQL> select granted_role, default_role from dba_role_privs where grantee='EXEMPLO';

GRANTED_ROLE                   DEF
------------------------------ ---
DBA                            NO
CONNECT                        YES
RESOURCE                       NO

A lista das DEFAULT ROLES (YES) podem ser obtidas na SYS.KU$_DEFROLE_LIST_VIEW:

SQL> set lines 200
SQL> select * from sys.KU$_DEFROLE_LIST_VIEW where user_name='EXEMPLO';

   USER_ID USER_NAME                      ROLE                              ROLE_ID
---------- ------------------------------ ------------------------------ ----------
      1422 EXEMPLO                        CONNECT                                 2

SQL> alter user exemplo default role connect,resource;

User altered.

SQL> select * from sys.KU$_DEFROLE_LIST_VIEW where user_name='EXEMPLO';

   USER_ID USER_NAME                      ROLE                              ROLE_ID
---------- ------------------------------ ------------------------------ ----------
      1422 EXEMPLO                        CONNECT                                 2
      1422 EXEMPLO                        RESOURCE                                3

SQL> select granted_role, default_role from dba_role_privs where grantee='EXEMPLO';

GRANTED_ROLE                   DEF
------------------------------ ---
DBA                            NO
CONNECT                        YES
RESOURCE                       YES

Fique atento! Como mencionado no inicio deste artigo (necessidades distintas de aplicação e segurança) podem fazer com que realmente seja preciso a existência de roles NÃO DEFAULT e alterando-as para DEFAULT pode gerar problemas.

Referências:
http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_10004.htm#SQLRF55312
http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_4003.htm#SQLRF53554

%name DEFAULT ROLE

Autor: Anderson Graf

Bacharel em Sistemas de Informação e MBA em Gestão de Banco de Dados Oracle. Entusiasta da tecnologia Oracle, ACE Associate ♠, autor em vários blogs e OTN. Consultor Oracle Senior na Exímio Soluções em TI

Envolvido em soluções de:
– Implementação, migração, gerenciamento e suporte a produtos Oracle, multiplataforma
– Monitoramento de ambientes 24×7
– Backup e Recovery
– Performance e Tuning
– Alta disponibilidade (HA) – RAC, Data Guard
– EM database/grid/cloud control
– Particionamento & Advanced Compression
– Oracle Engineered Systems – ODA, Exadata

Blog pessoal: http://www.andersondba.com.br
Articulista na Oracle Technology Network (OTN) – https://goo.gl/99R6yW
ACE Associate – https://goo.gl/MBB51b
Articulista GPO – http://profissionaloracle.com.br