2013-03-27 14 views
31

voglio far cadere alcuni utenti in Oracle DB utilizzando sqlplus ma sto ottenendo l'errore:utenti cadenti collegato a database Oracle

SQL> DROP USER test CASCADE; 
DROP USER test CASCADE 
* 
ERROR at line 1: 
ORA-01940: cannot drop a user that is currently connected 

ho seguito il link in modo da trovare le sessioni - Dropping a connected user from an Oracle 10g database schema

Ma quando ho eseguito il comando non ottengo alcun risultato:

SQL> select sid,serial# from v$session where username = 'test'; 

no rows selected 

Per favore aiutami come far cadere gli utenti in questo caso.

+0

È risposta può essere qui: http://anilanbu.blogspot.com/2012/02/ora-01940-cannot-drop-user-that-is.html – Art

+0

L'ho provato, ma non ho trovato alcuna riga quando ho cercato di scoprire le sessioni. – Chaitanya

+1

Ho scoperto perché non sto ottenendo i record di sessione, la mia condizione dovrebbe essere su username = 'TEST' – Chaitanya

risposta

51
SELECT s.sid, s.serial#, s.status, p.spid 
    FROM v$session s, v$process p 
WHERE s.username = 'TEST' --<<<-- 
    AND p.addr(+) = s.paddr 
/

Passo valori effettivi SID e SERIAL # per il test utente quindi cadere utente ...:

ALTER SYSTEM KILL SESSION '<SID>, <SERIAL>' 
/
+1

Come si automatizza questo: un comando? –

+6

@SkylarSaveland 'seleziona 'alter system kill session' '' || sid || ',' || numero seriale || '' ';' da v $ session where username = '' 'lo farà per te. – bschlueter

+0

Per me (Oracle 12c) non ci sono stati record in 'v $ session' ... – Betlista

17

Soluzione:

sql>Shutdown immediate; 

sql>startup restrict; 

sql>drop user TEST cascade; 

Se si desidera riattivare DB normalmente sia reimpostare il server o:

sql>Shutdown immediate; 

sql>startup; 

:)

+0

Questo ha funzionato per il mio caso. – mwangi

+0

La migliore soluzione attuale. – Worthy7

+0

È inoltre possibile ripristinare l'opzione RESTRICT utilizzando quanto segue: ALTER SYSTEM DISABLE SABLE RESTRICTED; – user3651293

0

Ho avuto lo stesso problema, la configurazione di Oracle in impostazione predefinita riguarda il registro delle lettere. Esattamente il mio Scheme_Name è stato scritto in lettere maiuscole. È possibile vedere il vostro Scheme_Name sulla scheda "Altri Utenti", se si utilizza Oracle S

1

fare una query:

SELECT * FROM v$session s;

Trova il tuo utente e fare la query successiva (con parametri appropriati):

ALTER SYSTEM KILL SESSION '<SID>, <SERIAL>';

+0

Non vedo alcuna differenza rispetto alla risposta più votata ... – Betlista

1

andare ai servizi in strumenti di amministrazione e selezionare oracleserviceSID e riavviarlo

+0

Ha funzionato per me. Nel mio caso era oracleserviceXE – GabrielBB

1

Stavo cercando di seguire il flusso descritto qui - ma non hanno la fortuna di uccidere completamente la sessione .. Poi ho affezionato ulteriore passo qui:
http://wyding.blogspot.com/2013/08/solution-for-ora-01940-cannot-drop-user.html

Quello che ho fatto:
1. select 'alter system kill session ''' || sid || ',' || serial# || ''';' from v$session where username = '<your_schema>'; - come descritto di seguito .
Out put sarà qualcosa di simile:
alter system kill session '22,15' immediate;
2. alter system disconnect session '22,15' IMMEDIATE ;-22-sid, 15-serie - ripetere il comando per ogni restituito sessione dal comando precedente
3. Ripetere i passaggi 1-2, mentre select... non restituisce un vuoto tavolo
4. chiamata drop user...

Ciò che è stato perso - chiamare alter system disconnect session '22,15' IMMEDIATE ; per ogni sessione restituito da select 'alter system kill session '..

+0

È necessario aggiungere un commento alla prima risposta. – Betlista

0

Ecco come I "automatizzare" Dropping gli utenti connessi in database Oracle:

# A shell script to Drop a Database Schema, forcing off any Connected Sessions (for example, before an Import) 
# Warning! With great power comes great responsibility. 
# It is often advisable to take an Export before Dropping a Schema 

if [ "$1" = "" ] 
then 
    echo "Which Schema?" 
    read schema 
else 
    echo "Are you sure? (y/n)" 
    read reply 
    [ ! $reply = y ] && return 1 
    schema=$1 
fi 

sqlplus/as sysdba <<EOF 
set echo on 
alter user $schema account lock; 
-- Exterminate all sessions! 
begin  
    for x in (select sid, serial# from v\$session where username=upper('$schema')) 
    loop 
    execute immediate ('alter system kill session '''|| x.Sid || ',' || x.Serial# || ''' immediate'); 
    end loop; 
    dbms_lock.sleep(seconds => 2); -- Prevent ORA-01940: cannot drop a user that is currently connected 
end; 
/
drop user $schema cascade; 
quit 
EOF 
0

Fondamentalmente credo che uccidere tutte le sessioni dovrebbe essere la soluzione, ma ...

Ho trovato una discussione simile - https://community.oracle.com/thread/1054062 al mio problema e che non ho avuto sessioni per gli utenti, ma ho comunque ricevuto l'errore. Ho provato anche secondo la migliore risposta:

sql>Shutdown immediate; 

sql>startup restrict; 

sql>drop user TEST cascade; 

cosa ha funzionato per me alla fine è stato quello di effettuare il login come utente, eliminare tutte le tabelle manualmente - selezionare per la creazione di dichiarazioni goccia è

select 'drop table ' || TABLE_NAME || ';' from user_tables; 

(ha bisogno di essere ri-eseguire più volte a causa di riferimenti)

non ho idea di come è quello relativo, ho lasciato cadere anche le funzioni e sequenze (perché quello era tutto quello che avevo nello schema)

W Quando l'ho fatto e mi sono disconnesso, ho avuto diverse sessioni nel tavolo v$session e quando ho ucciso quelle sono riuscito a far cadere l'utente.

Il mio DB era ancora avviato in modalità limitata (non sono sicuro se importante o meno).

Potrebbe aiutare qualcun altro.

BTW: la mia versione di Oracle è Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production

Problemi correlati