Trigger - bloquear lista de usuários

DBA Geral (instalação, configuração do banco, scripts do Sql*Plus, shell scripts, batch scripts, etc...)
Responder
elidias7
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 153
Registrado em: Qui, 01 Nov 2007 2:53 pm
Localização: Osasco
Eli Dias
Oracle Certified Professional

Boa noite.

Estou tentando montar uma trigger para bloqueio de usuário, até ai, tranquilo! Mas quero bloquear somente alguns usuários de sistema operacional.

Meu exemplo fixa os usuários numa variável, mas eu gostaria de cadastra-los em uma tabela e a trigger realizar a consulta, para que toda vez que fossem delegar privilegios de acesso para este caso, não faria alterações na trigger.

Veja meu exemplo:

Selecionar tudo

CREATE OR REPLACE TRIGGER SYS.BLOCK_LOGIN
AFTER LOGON ON DATABASE
  DECLARE
  v_prog sys.v_$session.program%TYPE;
  v_username sys.v_$session.username%TYPE;
  v_osuser sys.v_$session.osuser%TYPE;
  v_sid sys.v_$session.sid%TYPE;
  v_serial sys.v_$session.sid%TYPE;
  --v_inst_id sys.v_$session.sid%TYPE;
 
  BEGIN
 
  SELECT program, username, osuser, sid, serial#
  INTO v_prog, v_username, v_osuser, v_sid, v_serial
  FROM sys.v_$session
  WHERE sid = USERENV('SID')
  AND audsid != 0 -- Não verifica conexões do SYS
  AND rownum = 1; -- Parallel processes will have the same AUDSID's
 
  IF UPPER(v_osuser) not in ('BR3AMR','BR3CAM8') -- Estes são os usuários
 
  THEN
 
  IF (UPPER(v_username) = 'ADMRMS')
  THEN
 
  RAISE_APPLICATION_ERROR(-20000, 'Block Access! ('||v_osuser||' - '||v_username||' -  '||v_prog||')');
 
  END IF;
 
  END IF;
 
  EXCEPTION
 
  WHEN NO_DATA_FOUND THEN NULL;
 
  END;
/
Abraços,
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Você pode muito bem criar uma tabela e cadastrar uma lista de usuários.
Sugiro você criar essa tabela com um OWNER que outros não possam alterar nem mexer.
Daí no lugar de fazer um IF, você faz um simples SELECT nessa tabela pra ver se o usuário que você está testando está presente lá.

Eu não sei se a sua dúvida é isso mesmo, se não for, por favor tente nos esclarecer mais o problema. :-o
elidias7
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 153
Registrado em: Qui, 01 Nov 2007 2:53 pm
Localização: Osasco
Eli Dias
Oracle Certified Professional

O entendimento é esse mesmo, mas como ficaria o Select, seria uma subquery?
elidias7
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 153
Registrado em: Qui, 01 Nov 2007 2:53 pm
Localização: Osasco
Eli Dias
Oracle Certified Professional

Realmente preciso de ajuda, não sou bom em desenvolvimento, até tentei tirar todos os IF´s e colocar um select na tabela, mas bloqueia todo mundo:

Selecionar tudo

BEGIN
  SELECT program, username, osuser, sid, serial#
  INTO v_prog, v_username, v_osuser, v_sid, v_serial
  FROM sys.v_$session
  WHERE sid = USERENV('SID')
  AND audsid != 0 -- Não verifica conexões do sys
  AND rownum = 1; -- Parallel processes will have the same AUDSID's
  

--  IF (UPPER(v_username) = 'ADMRMS')

  SELECT COUNT(*) INTO l_i FROM system.acesso_rms WHERE UPPER( v_osuser ) = v_osuser;

	IF UPPER(v_osuser) <> l_i
		--THEN
  
  THEN
  
  RAISE_APPLICATION_ERROR(-20000, 'Acesso negado! ('||v_osuser||' - '||v_username||' -  '||v_prog||')');
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 7 visitantes