Há pouco tempo passei por um problema durante a criação de uma trigger de LOGON na versão 12c do banco de dados Oracle. Estava com alguns problemas em uma aplicação que tinha uma trigger de Logon. A trigger em si era bem simples, vou por o código mais abaixo, o problema é que ela estava criada dentro do usuário SYSTEM.
Provavelmente foi a maneira mais fácil e preguiçosa de criar o objeto, uma vez que o SYSTEM já possui todas as permissões necessárias para criação. Porém isso não uma boa prática. Então resolvi tirar do SYSTEM e jogar para o usuário dono dos objetos da aplicação.
Quando fui tentar criar o objeto no SCHEMA dono dos objetos da aplicação, recebi um erro com falta de permissões: ORA-01031: insufficient privileges. O erro ocorreu porque estava esquecendo de conceder a role ADMINISTER DATABASE TRIGGER para o usuário.
Em resumo, as permissões necessárias para criação de uma trigger:
Provavelmente foi a maneira mais fácil e preguiçosa de criar o objeto, uma vez que o SYSTEM já possui todas as permissões necessárias para criação. Porém isso não uma boa prática. Então resolvi tirar do SYSTEM e jogar para o usuário dono dos objetos da aplicação.
Quando fui tentar criar o objeto no SCHEMA dono dos objetos da aplicação, recebi um erro com falta de permissões: ORA-01031: insufficient privileges. O erro ocorreu porque estava esquecendo de conceder a role ADMINISTER DATABASE TRIGGER para o usuário.
Em resumo, as permissões necessárias para criação de uma trigger:
- CREATE TRIGGER - para criar uma trigger no seu próprio esquema (SCHEMA)
 - CREATE ANY TRIGGER - caso queira que o usuário conectado crie a trigger em outro esquema (SCHEMA)
 - ADMINISTER DATABASE TRIGGER - te permite criar triggers de leveis de banco de dados (server erro, login and logout triggers). Permissão também te permite realizar a conexão com a base de dados independente de erros na trigger de login.
 
Abaixo realizei alguns testes numa base de dados Oracle 12.
Fiz a conexão no PDB com o usuário SYSTEM para criar o objeto no usuário TESTE. Concedi os privilégios, mas o erro continuava.
SQL> create user teste identified by teste; 
User created. 
SQL> grant CREATE TRIGGER to teste; 
Grant succeeded. 
SQL> grant CREATE SESSION to teste; 
Grant succeeded. 
 | 
create or replace TRIGGER TESTE.TR_LOGIN 
AFTER 
    LOGON 
ON 
    DATABASE 
when (UPPER(SYS_CONTEXT('USERENV', 'SESSION_USER')) IN (UPPER('TESTE'))) 
BEGIN 
    EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = THIAGO'; 
END; 
/ 
ERROR at line 1: 
ORA-01031: insufficient privileges 
 | 
Após conceder a role ADMINISTER DATABASE TRIGGER para o TESTE.
SQL> grant ADMINISTER DATABASE TRIGGER to teste; 
Grant succeeded. 
SQL> create or replace TRIGGER teste.TAL_ALTSCHEMA_TJCEPRO 
AFTER 
    LOGON 
ON 
    DATABASE 
when (UPPER(SYS_CONTEXT('USERENV', 'SESSION_USER')) IN (UPPER('TESTE'))) 
BEGIN 
    EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = THIAGO'; 
END; 
/   
Trigger created. 
 | 
Comentários