Restringindo nome do usuário Oracle com Trigger

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 👍!

Deixe um comentário

Seu e-mail não será publicado.