Pular para o conteúdo
Visualizando 15 posts - 1 até 15 (de 34 do total)
  • Autor
    Posts
  • #95729
    Niggaz
    Participante

      Boa tarde galera,

      eu estou fazendo um esquema para desconectar um usuario e mais para frente, no mesmo script eu quero dropa-lo.

      Código:

      DECLARE
      vSid NUMBER:=NULL;
      vSerial NUMBER:=NULL;
      CURSOR curDados IS
      SELECT
      SID
      ,SERIAL#
      INTO vSid, vSerial
      FROM V$SESSION
      WHERE USERNAME = ‘TESTEDROP’;
      BEGIN
      OPEN curDados;
      LOOP
      FETCH curDados INTO vSid, vSerial;
      EXIT WHEN curDados%NOTFOUND;
      EXECUTE IMMEDIATE ‘ALTER SYSTEM DISCONNECT SESSION’
      ||””||vSid||’,’||vSerial||””||’ IMMEDIATE’;
      END LOOP;
      CLOSE curDados;
      END;

      O que acontece é o seguinte: Ele desconecta o usuário, porém ele só some da V$Session, qdo eu tento rodar um select qualquer nesse usuário, pq ai ele percebe que a sessão não existe mais. O que posso fazer fazer esse processo sumir da v$session?

      Abraços!

      #95755
      Niggaz
      Participante

        Ninguem? 🙁

        #95764
        jspaulonci
        Participante

          Niggaz, não entendi

          O que acontece, ele sai da V$session ou não ?

          #95766
          Niggaz
          Participante

            Boa tarde jspaulonci!

            acontece o seguinte: Ele mata a sessão. Porém o SID e o SERIAL#(os mesmo que eu usei no alter syste….) não somem da V$session.

            Como eu sei que ele matou a sessão? Ainda conectado no usuário que eu teoricamente “matei”, tem fazer um select qlq: SELECT sysdate FROM DUAL, acontece o erro de fim de comunicação… faço o select na V$session novamente, e só agora o processo saiu…após o SELECT.

            Tendeu?

            Abs

            #95767
            jspaulonci
            Participante

              Faça o seguinte, verifique qual é status do sid e do serial depois do disconnect ?

              #95769
              Niggaz
              Participante

                O status está como KILLED.

                #95772
                Niggaz
                Participante

                  Então jspaulonci,

                  a ideia do script é: Matar a sessão do user, e depois dropar o mesmo. Porém se eu coloco o DROP dentro do script, ele da erro de user conectado.
                  Fora do bloco PL, ele executa….


                  DECLARE
                  vSid NUMBER:=NULL;
                  vSerial NUMBER:=NULL;
                  CURSOR curDados IS
                  SELECT
                  SID
                  ,SERIAL#
                  INTO vSid, vSerial
                  FROM V$SESSION
                  WHERE USERNAME = 'TESTEDROP';
                  BEGIN
                  OPEN curDados;
                  LOOP
                  FETCH curDados INTO vSid, vSerial;
                  EXIT WHEN curDados%NOTFOUND;
                  EXECUTE IMMEDIATE 'ALTER SYSTEM DISCONNECT SESSION'
                  ||''''||vSid||','||vSerial||''''||' POST_TRANSACTION';
                  END LOOP;
                  CLOSE curDados;
                  BEGIN
                  EXECUTE IMMEDIATE 'DROP USER TESTEDROP CASCADE';
                  END;
                  END;

                  Erro: ORA-01940 – não é possivel eliminar um usuário conectado….

                  #95774
                  burga
                  Participante

                    Mesmo com o IMMEDIATE ao invés do POST_TRANSACTION ainda deu erro??

                    #95776
                    Niggaz
                    Participante

                      [quote=”burga”:3vtem8v2]Mesmo com o IMMEDIATE ao invés do POST_TRANSACTION ainda deu erro??[/quote]

                      Ainda burga!

                      e se eu colocar o DROP USER….fora do bloco PL, ele roda normal!!

                      #95777
                      burga
                      Participante

                        Escreva uma procedure só pra matar as seções, chame a procedure e depois drope o usuário… Pode ser dessa forma:

                        DECLARE
                        PROCEDURE kill_user(p_user IN VARCHAR2) IS
                        vSid NUMBER:=NULL;
                        vSerial NUMBER:=NULL;
                        CURSOR curDados(p_user IN VARCHAR2) IS
                        SELECT
                        SID,SERIAL#
                        FROM V$SESSION
                        WHERE USERNAME = p_user;
                        BEGIN
                        OPEN curDados(p_user);
                        LOOP
                        FETCH curDados INTO vSid, vSerial;
                        EXIT WHEN curDados%NOTFOUND;
                        EXECUTE IMMEDIATE 'ALTER SYSTEM DISCONNECT SESSION '''
                        ||vSid||','||vSerial||''' IMMEDIATE';
                        END LOOP;
                        CLOSE curDados;
                        END;

                        l_user VARCHAR2(30);
                        BEGIN
                        l_user := 'TESTEDROP';
                        kill_user(l_user);
                        EXECUTE IMMEDIATE 'DROP USER '||l_user||' CASCADE';
                        END;
                        /

                        Aqui deu certo!

                        #95778
                        VitorLeandro
                        Participante

                          Pois é, talves o usuário já esteja desconectado, mas algum processo deste usuário ainda esteja pendente.

                          select s.sid, s.serial#, p.spid, s.status
                          from v$session s, v$process p
                          where s.username = ‘myuser’
                          and p.addr (+) = s.paddr;

                          #95780
                          Niggaz
                          Participante

                            burga,

                            vou criar a procedure assim com vc falou e chama-la qdo for necessario. Dessa forma eu teste e funcionou aqui tbm.

                            Obrigado pelo Help!

                            Abraços 😛

                            #95788
                            jspaulonci
                            Participante

                              Niggaz , faz o seguinte então, em vez de vc dar um disconect no usuário, de um kill session na sessão, depois teste se existem sessão em status de KILLED, as que estiver em KILLED tente matar novamente, talvez você não consiga, o Oracle talvez retornará um erro dizendo que a sessão é inválida, aí o jeito é matar pelo processo PID, se sua plataforma for Windows você não conseguirá.
                              Então você pega o pid e monta um script pelo SO mesmo para matar essas excessões.

                              #95791
                              burga
                              Participante

                                Oi João, o DISCONNECT não elimina a necessidade de matar o processo pelo SO? Existe algo que impeça o processo de ser morto na hora com o DISCONNECT IMMEDIATE? 😳

                                #95792
                                jspaulonci
                                Participante

                                  Então Burga, o que posso te dizer é que pode ficar algo preso entende ?
                                  Infelizmente vejo esse comportamento no Oracle, é nesses casos que a teoria difere da experiência.

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