This post is also available in: English
Umas das tarefas importantes que o DBA tem é de manter organizado e controlado os usuários/schemas que existem na base de dados. Algumas empresas possuem uma nomenclatura padrão dos seus funcionário e prestadores e, para evitar a criação de usuários diferentes, é possível criar um processo que restrinja o nome desses usuários criados.
Para isso, o DBA pode criar uma trigger de sistema, que vai verificar se o usuário obedece a regra de nomenclatura. Veja o Exemplo:
CREATE OR REPLACE TRIGGER TRG_FILTRA_USER BEFORE CREATE ON DATABASE BEGIN IF ORA_DICT_OBJ_TYPE = 'USER' AND ORA_LOGIN_USER <> 'SYS' THEN IF NOT REGEXP_LIKE(ORA_DICT_OBJ_NAME, '^(T|F)\d{7}?$') THEN RAISE_APPLICATION_ERROR(-20999, 'User must be on "FNNNNNNN" or "TNNNNNNN" format.'); END IF; END IF; END TRG_FILTRA_USER; /
Neste caso, estamos criando uma trigger em que todos os usuários (exceto o SYS) só poderão criar usuários que comecem com "T" ou "F" seguidos de 7 dígitos.
Ela é acionada sempre antes de um comando "create", mas em conjunto com o filtro "ora_dict_obj_type", restringimos a criação específica de usuários. Existem outras variáveis que podemos usar nesta DDL trigger para reduzir ainda mais o escopo de execução, como por exemplo:
- ora_sysevent - O evento de sistema que foi disparado. No caso do exemplo, o valor seria "CREATE". Normalmente é o que vêm após a cláusula "AFTER" ou "BEFORE" no início da trigger.
- ora_login_user - O usuário logado que efetuou o comando.
- ora_instance_num - Em caso de um ambiente em RAC, o número da instância em que o comando está sendo executado.
- ora_database_name - O próprio nome já diz.
- ora_dict_obj_type - O tipo de objeto que está sendo alterado pelo evento de sistema. Pode ser, por exemplo, uma tabela, role, procedure ou, como acima, um usuário.
- ora_dict_obj_name - O nome do objeto sendo alterado pela DDL.
- ora_dict_obj_owner - O owner do objeto sendo alterado pela DDL. Não se aplica para, por exemplo, "ora_sysevent=USER", como é o caso da trigger demonstrada acima.
Para mais informações de funções que podem ser utilizadas em triggers de DDL, o PSOUG tem uma boa listagem.
Gostou? Não deixe de comentar ou deixar um 👍!