Pular para o conteúdo
Visualizando 15 posts - 1 até 15 (de 17 do total)
  • Autor
    Posts
  • #101455
    armandoveloso
    Participante

      Ola, 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.html

      Adaptei 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.

      #101457
      rman
      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…

        #101458
        armandoveloso
        Participante

          rman,

          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.

          #101459
          rman
          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.

            #101470
            jspaulonci
            Participante

              Porque pelo profile não funciona ?, tenho um método interessante.

              #101471
              jspaulonci
              Participante

                create profile profile_limita limit
                sessions_per_user 3;
                — Add users to profile
                alter user usuario_limitado profile profile_limita;

                #101474
                rman
                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.

                  #101477
                  armandoveloso
                  Participante

                    rman,

                    a aplicação é desktop.

                    O estouro de memoria é no servidor de BD, recusando novas sessoes de usuarios.

                    #101478
                    armandoveloso
                    Participante

                      Joao Paulo,

                      ia te explicar pq nao funciona, mas o rman ja antecipou…

                      Obrigado!

                      #101479
                      jspaulonci
                      Participante

                        Eu entendi a sua necessidade, porque a sua trigger não funcionou ?

                        #101480
                        rman
                        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 ?

                          #101481
                          jspaulonci
                          Participante

                            Armando, poste os erros de alert, check os parametros transactions, sessions e proccess. O Oracle tem que reclamar de alguma coisa antes de capotar

                            #101483
                            felipeg
                            Participante

                              Opa,

                              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.

                              #101493
                              armandoveloso
                              Participante

                                Os 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: 1094

                                Pga: 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 bytes

                                Aumentei 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.

                                #101496
                                rman
                                Participante

                                  @armandoveloso

                                  Qual modo de conexão está sendo utilizado ? Dedicado ou compartilhado ?

                                  Se utilizar o modo compartilhado não solucionaria o problema ?

                                Visualizando 15 posts - 1 até 15 (de 17 do total)
                                • Você deve fazer login para responder a este tópico.