it-swarm-eu.dev

Eliminazione di un utente connesso da uno schema di database Oracle 10g

Esiste un modo migliore per disconnettere forzatamente tutti gli utenti da uno schema di database Oracle 10g piuttosto che riavviare i servizi di database Oracle?

Abbiamo diversi sviluppatori che utilizzano SQL Developer connettendosi allo stesso schema su un singolo server Oracle 10g. Il problema è che quando vogliamo eliminare lo schema per ricostruirlo, inevitabilmente qualcuno è ancora connesso e non possiamo eliminare lo schema del database o l'utente mentre qualcuno è ancora connesso.

Allo stesso modo, non vogliamo eliminare tutte le connessioni ad altri schemi perché altre persone potrebbero essere ancora connesse e testare con quegli schemi.

Qualcuno sa di un modo rapido per risolvere questo?

61
Joshua Starner

Per trovare le sessioni, utilizzare come DBA

select sid,serial# from v$session where username = '<your_schema>'

Se vuoi essere sicuro solo di ottenere le sessioni che utilizzano SQL Developer, puoi aggiungere and program = 'SQL Developer'. Se desideri eliminare solo le sessioni appartenenti a uno sviluppatore specifico, puoi aggiungere una limitazione su os_user

Quindi uccidili con

alter system kill session '<sid>,<serial#>'

(per esempio. alter system kill session '39,1232')

Potrebbe essere una query che produce istruzioni kill predefinite

select 'alter system kill session ''' || sid || ',' || serial# || ''';' from v$session where username = '<your_schema>'

Ciò restituirà un'istruzione kill per sessione per quell'utente - qualcosa del tipo:

alter system kill session '375,64855';

alter system kill session '346,53146';

105
Sten Vesterli

Trova le sessioni esistenti su DB usando questa query:

SELECT s.inst_id,
       s.sid,
       s.serial#,
       p.spid,
       s.username,
       s.program
FROM   gv$session s
       JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id
WHERE  s.type != 'BACKGROUND';

vedrai qualcosa di simile al di sotto. Oracle Sessions

Quindi, esegui sotto la query con i valori estratti dai risultati precedenti.

ALTER SYSTEM KILL SESSION '<put above s.sid here>,<put above s.serial# here>';

Esempio: ALTER SYSTEM KILL SESSION '93, 943 ';

17
Chand Priyankara

la mia proposta è questo semplice blocco anonimo:

DECLARE
   lc_username   VARCHAR2 (32) := 'user-name-to-kill-here';
BEGIN
   FOR ln_cur IN (SELECT sid, serial# FROM v$session WHERE username = lc_username)
   LOOP
      EXECUTE IMMEDIATE ('ALTER SYSTEM KILL SESSION ''' || ln_cur.sid || ',' || ln_cur.serial# || ''' IMMEDIATE');
   END LOOP;
END;
/
9
RLapinski

Assicurarsi di modificare il sistema e abilitare la sessione limitata prima di ucciderli o che accederanno rapidamente al database prima di completare il lavoro.

1
tc

basta usare SQL:

disconnect; 

conn tiger/scott as sysdba;
1

Hai provato ALTER SYSTEM KILL SESSION? Ottieni il SID e il SERIAL # da V $ SESSION per ogni sessione nello schema indicato, quindi esegui

ALTER SCHEMA KILL SESSION sid, numero seriale;

0
Dave Costa

Solo i miei due centesimi: il modo migliore (ma probabilmente non il più veloce a breve termine) sarebbe probabilmente quello di far lavorare ciascuno sviluppatore sulla propria istanza di database (vedi regola n. 1 per il lavoro di database ).

L'installazione di Oracle su una stazione di sviluppo è diventata un gioco da ragazzi da Oracle Database 10g Express Edition .

0
Mac