2008-09-17 4 views
53

Gibt es eine bessere Möglichkeit, alle Benutzer zwangsweise von einem Oracle 10g-Datenbankschema zu trennen, als die Oracle-Datenbankdienste neu zu starten?Einen verbundenen Benutzer aus einem Oracle 10g-Datenbankschema löschen

Wir haben mehrere Entwickler, die SQL Developer verwenden, die sich mit demselben Schema auf einem einzelnen Oracle 10g-Server verbinden. Das Problem ist, dass, wenn wir das Schema löschen wollen, um es neu zu erstellen, unausweichlich jemand immer noch verbunden ist und wir das Datenbankschema oder den Benutzer nicht fallen lassen können, solange noch jemand verbunden ist.

Aus demselben Grund möchten wir nicht alle Verbindungen zu anderen Schemas trennen, weil andere Personen möglicherweise noch verbunden sind und mit diesen Schemas testen.

Wer weiß von einem schnellen Weg, um dies zu beheben?

Antwort

97

Um die Sitzungen als DBA Verwendung

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

zu finden Wenn Sie sicher sein wollen, nur die Sitzungen zu erhalten, die SQL Developer verwenden, Sie and program = 'SQL Developer' hinzufügen können. Wenn Sie nur Sitzungen, die zu einem bestimmten Entwickler töten wollen, können Sie eine Beschränkung os_user

hinzufügen Dann tötet sie mit

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

(zB alter system kill session '39,1232')

A Abfrage, die fertig gebaute Kill-Anweisungen erzeugt, könnte

sein

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

Dies wird für den Benutzer pro Sitzung einen Kill-Anweisung zurückgeben - so etwas wie:

alter system kill session '375,64855';

alter system kill session '346,53146';

+0

ich, dass in unserer RAC-Umgebung gefunden, verließ die Sitzung oft töten sie hängen, aber die Prozess-ID herauszufinden, und es vom Betriebssystem immer gearbeitet Tötung . – Jonathan

+4

kleiner Zusatz - fügen Sie sofort zum Befehl hinzu: 'select 'alter system kill session' '' || Sid || ',' || Seriennr. || ''' sofortig;' von v $ session wo username = ''; 'dies wird den Befehl – Michael

+0

nice antwort erzwingen. Genau das, was ich gesucht habe. –

0

Haben Sie versucht ALTER SYSTEM KILL SESSION? Holen Sie sich das SID und SERIAL # von V $ SESSION für jede Sitzung in der angegebenen Schema, dann tun

ALTER SCHEMA KILL SESSION sid, Serien #;

0

Nur meine zwei Cent: Der beste Weg (aber wahrscheinlich nicht Am schnellsten würde es für jeden Entwickler sein, an einer eigenen Datenbankinstanz zu arbeiten (siehe rule #1 for database work).

Die Installation von Oracle auf einer Entwicklerstation wurde zu einem Kinderspiel seit Oracle Database 10g Express Edition.

+0

Nur für Windows und bestimmte Varianten von Linux. –

+0

Das ist nicht wirklich relevant für die Frage? – Konrads

+0

Es könnte nicht die Antwort sein, nach der der Fragesteller gesucht hat, und ich kann perfekt verstehen, warum es nicht stark aufgewertet wurde, aber ich denke, dass es sehr relevant ist, wenn man den Anwendungsfall berücksichtigt, den er speziell vorgebracht hat. Mehrere Entwickler, die an der gleichen Datenbank arbeiten, sind eine sehr schlechte Idee, und dieses Problem ist definitiv nicht das Schlimmste, was passieren wird. – Mac

1

Stellen Sie sicher, dass Sie das System ändern und eine eingeschränkte Sitzung aktivieren, bevor Sie sie beenden, oder dass sie sich schnell wieder in der Datenbank anmelden, bevor Sie Ihre Arbeit abgeschlossen haben.

+2

Es kann einfacher und weniger aufdringlich sein, den Benutzer, den er fallen lassen möchte, zu sperren und dann alle verbundenen Sitzungen dieses Benutzers zu beenden, sie dann zu löschen und neu zu erstellen. Sie müssen den Zugriff auf andere Benutzer nicht unnötig einschränken. –

1

verwenden nur SQL:

disconnect; 

conn tiger/scott as sysdba; 
15

Finden bestehenden Sitzungen DB diese Abfrage mit:

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'; 

Sie so etwas wie unten sehen werden.

Dann führen Sie unter Abfrage mit Werten aus den obigen Ergebnissen extrahiert.

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

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

7

mein Vorschlag ist dieser einfache anonyme Block:

DECLARE 
    lc_username VARCHAR2 (32) := 'your user name 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; 
/
+1

besser zu beachten, bevor sie Sitzungen töteten, konnten sie stecken bleiben – user3380585

Verwandte Themen