- Este tópico contém 33 respostas, 5 vozes e foi atualizado pela última vez 15 anos, 6 meses atrás por
Peterson.
-
AutorPosts
-
27 de agosto de 2010 às 11:28 pm #95729
Niggaz
ParticipanteBoa 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!
30 de agosto de 2010 às 5:47 pm #95755Niggaz
ParticipanteNinguem? 🙁
30 de agosto de 2010 às 8:38 pm #95764jspaulonci
ParticipanteNiggaz, não entendi
O que acontece, ele sai da V$session ou não ?
30 de agosto de 2010 às 9:36 pm #95766Niggaz
ParticipanteBoa 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
30 de agosto de 2010 às 9:38 pm #95767jspaulonci
ParticipanteFaça o seguinte, verifique qual é status do sid e do serial depois do disconnect ?
30 de agosto de 2010 às 9:55 pm #95769Niggaz
ParticipanteO status está como KILLED.
30 de agosto de 2010 às 10:45 pm #95772Niggaz
ParticipanteEntã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….
30 de agosto de 2010 às 11:26 pm #95774burga
ParticipanteMesmo com o IMMEDIATE ao invés do POST_TRANSACTION ainda deu erro??
30 de agosto de 2010 às 11:35 pm #95776Niggaz
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!!
30 de agosto de 2010 às 11:57 pm #95777burga
ParticipanteEscreva 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!
30 de agosto de 2010 às 11:58 pm #95778VitorLeandro
ParticipantePois é, 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;31 de agosto de 2010 às 12:28 am #95780Niggaz
Participanteburga,
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 😛
31 de agosto de 2010 às 1:45 pm #95788jspaulonci
ParticipanteNiggaz , 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.31 de agosto de 2010 às 3:59 pm #95791burga
ParticipanteOi 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? 😳
31 de agosto de 2010 às 4:03 pm #95792jspaulonci
ParticipanteEntã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. -
AutorPosts
- Você deve fazer login para responder a este tópico.