Social Icons

18 de set de 2017

Evitando erros com privilégios de roles




Olá pessoal,

     No post de hoje quero apenas compartilhar algumas informações que muitos de nós (DBAs), às vezes temos problemas, por causa de alguns detalhes ao trabalhar com roles.
 
     Para aqueles que ainda não sabem direito o que é uma role, suas vantagens etc., sugiro primeiramente a leitura do link About Privileges and Roles. O que vou compartilhar neste artigo é apenas uma forma simples de evitar alguns erros que muitos de nós podemos cometer ao trabalhar com roles, por descuido ou falta de conhecimento.
   
     Quando o DBA quer atribuir uma ou mais roles a um determinado usuário, basta ele executar o comando "GRANT RL_NOME TO USUARIO" (fazendo as devidas substituições nos valores em laranja), que por padrão ele já recebe os privilégios dessa role ao fazer logon no banco de dados, mas nem sempre isso ocorre, e é nas exceções, que nós DBAs, muitas vezes nos atrapalhamos. Já vi diversas vezes o erro "ORA-01031: insufficient privileges" ocorrer em sistemas porque o usuário tinha N roles, mas só 1 delas, por exemplo, estava como default, e não era aquela que continha os privilégios necessários para o usuário acessar o objeto que disparou o erro.
      
     Vou demonstrar abaixo um exemplo para entendermos melhor o que gera o erro. O usuário FABIO tem que ter 4 roles como default: RL_A, RL_B, RL_C e RL_D. Para que isso funcione bem, basta atribuir todas elas como default seguindo o exemplo "GRANT Role TO usuario", porém passaram inicialmente, para o DBA, somente o nome de 3 roles, e ele executou os comandos abaixo:
         GRANT RL_A TO FABIO;
         GRANT RL_B TO FABIO;
         GRANT RL_C TO FABIO;

     Após atribuir as roles ao usuário FABIO, o DBA executou (desnecessariamente para este caso) o comando abaixo para definir que elas ficassem como default:
         ALTER USER FABIO DEFAULT ROLE RL_A, RL_B, RL_C;

     Depois de alguns dias, passaram para outro DBA, o nome da última role e ele executou apenas o comando abaixo para atribuí-la ao usuário FABIO:
         GRANT RL_D TO FABIO;

      Depois de alguns minutos os usuários foram testar o sistema e viram o erro "ORA-01031". Neste momento o segundo DBA se pergunta por que o erro está ocorrendo, executa a consulta abaixo e vê que apenas as 3 primeiras roles (RL_A, RL_B e RL_C) estão como default para o usuário. Ele não sabia que o 1º DBA havia executado o comando "ALTER USER .... DEFAULT ROLE <nomes roles>", por isso a nova role não entrou como default, e esse é realmente o comportamento esperado que confunde muitos DBAs (ver Imagem 01 abaixo), pois alguns esperam que novas roles entrem sempre como default:

Imagem 01 - Roles atribuídas ao usuário FABIO

     Agora vamos às perguntas e respostas para entender o que fazer para evitar/resolver o erro ocorrido:

1- O que poderia ter sido feito para evitar o erro? 
R.: Para evitá-lo é fácil. Bastaria não ter executado o comando "ALTER USER FABIO DEFAULT ROLE RL_A, RL_B, RL_C;", que todas as roles atribuídas ao usuário sempre seriam concedidas como default. 

2- O que fazer neste caso para resolver o erro que já está ocorrendo?
R.: Vou indicar apenas a forma mais efetiva. Execute o comando abaixo para atribuir todas as roles existentes, e as que também serão atribuídas futuramente, como DEFAULT:
     ALTER USER FABIO DEFAULT ROLE ALL;


Imagem 02 - Roles atribuídas ao usuário FABIO após execução do comando
"ALTER USER FABIO DEFAULT ROLE ALL"


     Para saber mais sobre o assunto, consulte o Doc "Enabling, Disabling, and Granting Default Roles", ID 1079975.6, no MOS. 
  
[]s
   

0 comentários:

Postar um comentário

 

Suporte remoto alunos

Seguidores

Meu One Drive (antigo Sky Drive)