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