- Este tópico contém 16 respostas, 4 vozes e foi atualizado pela última vez 14 anos, 4 meses atrás por
rman.
-
AutorPosts
-
1 de novembro de 2011 às 7:50 pm #101455
armandoveloso
ParticipanteOla, tod@s!
BD 9i.
S.O.: Windows Server 2003 32 bits.Utilizamos aplicação de terceiro, e essa aplicação usa apenas 1 usuario para se conectar ao banco.
Preciso limitar a quantidade de logons por usuario, como a aplicação utiliza o mesmo usuario de banco, nao da pra fazer por meio de PROFILE, então, estou querendo limitar pelo OSUSER da sessão do usuário.
Achei uma dica “parecida”, do colega Diego Lopes, em que ele fez uma trigger para proibir acesso ao BD usando algumas ferramentas.
http://profissionaldeoracle.blogspot.co … tivos.htmlAdaptei essa trigger para tentar pegar a QUANTIDADE de sessoes no BD pelo campo OSUSER:
CREATE OR REPLACE TRIGGER “SYS”.”LIMITE_LOGON” AFTER LOGON ON DATABASE
DECLARE
v_sid number;
v_qtde_sess number;
v_msg varchar2(200);
BEGIN
SELECT DISTINCT sid INTO v_sid
FROM sys.v_$mystat;SELECT COUNT(*) INTO v_qtde_sess
FROM V$SESSION s1
WHERE s1.osuser =
(SELECT s2.osuser FROM V$SESSION s2
where s2.sid = v_sid);v_msg := ‘Tentativa de conexao recusada. Limite máximo de 2 conexões!!!’;
— Verifica se atingiu o maximo de 2 conexoes permitidas e recusa.
IF (v_qtde_sess > 2)
THEN
RAISE_APPLICATION_ERROR(-20000,v_msg,true);
END IF;
END;Não obtive sucesso com essa trigger.
Alguma ajuda???
Att.,
Armando.2 de novembro de 2011 às 1:31 am #101457rman
Participante@armandoveloso
Qual é o real problema a ser resolvido ? Por que é necessário limitar o acesso por usuário ? O que você pretende evitar aplicando essa solução ?
É possível o Oracle mesmo possuindo um usuário saber qual é o usuário da aplicação, mas é necessário alterar a aplicação… Se for possível alterar a aplicação me avisa que te explico melhor…
2 de novembro de 2011 às 1:55 am #101458armandoveloso
Participanterman,
nao é possivel alterar a aplicação, pelo menos de imediato.. teria que ser solicitado, pois nao somos nós que desenvolvemos.
Seus questionamentos são válidos, na verdade, seria um paliativo essa trigger para diminuir um pouco os “abusos” de alguns usuários que insistem em abrir a aplicacao varias vezes e deixar rodando em paralelo, criando varias sessoes na base.
Limitar a duas ou 3 conexoes diminuiria a quantidade de sessoes no banco, que hoje enfrenta estouro de memória. Isso enquanto recebemos um novo servidor e storage, para colocar em SO 64 bits.
Servidor Windows e ainda 32 bits… ta ruim!
Tenho diminuido algumas areas da SGA, como tambem a PGA, deixando apenas a cache grande. O Servidor tem 16GB de RAM, mas acima de 4GB o windows so usa pra cache do oracle… Temos hoje acima de 500 conexoes simultaneas.Abraço,
Armando.2 de novembro de 2011 às 3:34 am #101459rman
Participante@armandoveloso
Estouro de memória ? O que exatamente é isso ? O banco chega a cair ? Ou o problema de estouro de memória é no servidor de aplicação ?
Se o problema for no servidor de aplicação, é melhor não fazer nada, e acionar o suporte. Geralmente o paliativo de hoje é a solução definitiva… 😯
Neste caso é mais fácil explicar pro usuário as consequências de rodar o aplicativo em paralelo, pelo fato de ter transação o sistema pode dar lock, e ele não conseguir fazer nem uma atividade nem outra… E dependendo como a aplicação foi feita, pode gerar até inconsistências.
3 de novembro de 2011 às 7:09 pm #101470jspaulonci
ParticipantePorque pelo profile não funciona ?, tenho um método interessante.
3 de novembro de 2011 às 7:11 pm #101471jspaulonci
Participantecreate profile profile_limita limit
sessions_per_user 3;
— Add users to profile
alter user usuario_limitado profile profile_limita;3 de novembro de 2011 às 7:27 pm #101474rman
Participante@jspaulonci
Não funciona por que o aplicativo usa apenas 1 usuário no banco. Desta forma seria possível 3 aplicações abertas.
3 de novembro de 2011 às 7:50 pm #101477armandoveloso
Participanterman,
a aplicação é desktop.
O estouro de memoria é no servidor de BD, recusando novas sessoes de usuarios.
3 de novembro de 2011 às 7:53 pm #101478armandoveloso
ParticipanteJoao Paulo,
ia te explicar pq nao funciona, mas o rman ja antecipou…
Obrigado!
3 de novembro de 2011 às 8:01 pm #101479jspaulonci
ParticipanteEu entendi a sua necessidade, porque a sua trigger não funcionou ?
3 de novembro de 2011 às 8:31 pm #101480rman
Participante@armandoveloso
Nunca vi isso acontecer, quando isso acontece, é apresentado alguma mensagem de erro ?
O problema não está no listener ?
Outra pergunta, quantos GB tem a SGA e PGA ?
3 de novembro de 2011 às 8:38 pm #101481jspaulonci
ParticipanteArmando, poste os erros de alert, check os parametros transactions, sessions e proccess. O Oracle tem que reclamar de alguma coisa antes de capotar
3 de novembro de 2011 às 8:53 pm #101483felipeg
ParticipanteOpa,
De qualquer forma, você pode bloquear desta maneira, apenas altere o valor pelo usuário do banco da aplicação.
CREATE OR REPLACE TRIGGER LIMITE_LOGON AFTER LOGON ON DATABASE
DECLARE
v_machine varchar2(200);
v_qtde_sess number;
v_msg varchar2(200);
BEGIN
SELECT sys_context('USERENV', 'HOST') into v_machine FROM DUAL;SELECT COUNT(*) into v_qtde_sess FROM V$SESSION WHERE machine = v_machine and username = ''; v_msg := 'Tentativa de conexao recusada. Limite máximo de 1 conexão!'; -- Verifica se o usuário já possui conexão em aberto IF (v_qtde_sess > 1) THEN RAISE_APPLICATION_ERROR(-20000,v_msg,true); END IF;END;
E outra coisa, o PROFILE vai sim limitar o número de sessões, só que será para o Banco inteiro, logo, se o limite de sessões for 10, um usuário pode conectar com 9 e o outro com 1, triste isso.
Uma idéia também é monitorar o tempo médio de trabalho e começar a varrer as conexões que ficarem muito tempo inativas (como com IDLE_TIME por exemplo).
Enfim, esse tipo de aceso de aplicação é problemático mesmo, boa sorte.
Atenciosamente,
Felipe.4 de novembro de 2011 às 3:47 pm #101493armandoveloso
ParticipanteOs erros mais comuns são ORA-12500 e ROW-00001.
Novas sessoes sao negadas, tanto na aplicacao quanto em ferramentas de adm do BD, como um simples sqlplus…
Sessions: 995
Processes: 900
Transactions: 1094Pga: 300M
Sga:
Total System Global Area 1.0177E+10 bytes
Fixed Size 455624 bytes
Variable Size 738197504 bytes
Database Buffers 9437184000 bytes
Redo Buffers 1191936 bytesAumentei a Share ontem a noite, de 300M para 370M.
Diminuí a area de sort também, acho que pode ajudar…Valores para esses parametros não são faceis de entendimento em ambiente windows 32 bits… visto que apenas a cache size do oracle é armazenada na ram que existe na maquina acima de 4GB.
Aumentar muito a PGA e a shared diminui a area de memoria do windows disponivel pras sessoes de usuarios. Ja fiz isso aqui e estourava na epoca que tinhamos uma media de 300 conexoes. Hoje temos uma media de 500 conexoes.
Obrigado,
Armando.4 de novembro de 2011 às 4:41 pm #101496rman
Participante@armandoveloso
Qual modo de conexão está sendo utilizado ? Dedicado ou compartilhado ?
Se utilizar o modo compartilhado não solucionaria o problema ?
-
AutorPosts
- Você deve fazer login para responder a este tópico.