it-swarm-eu.dev

Löschen eines verbundenen Benutzers aus einem Oracle 10g-Datenbankschema

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

Es gibt mehrere Entwickler, die SQL Developer verwenden und auf einem einzelnen Oracle 10g-Server eine Verbindung zu demselben Schema herstellen. Das Problem ist, dass beim Löschen des Schemas zum erneuten Erstellen zwangsläufig immer noch eine Verbindung besteht und das Datenbankschema oder der Benutzer nicht gelöscht werden können, solange noch eine Verbindung besteht.

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

Kennt jemand einen schnellen Weg, um dieses Problem zu lösen?

61
Joshua Starner

Um die Sessions zu finden, verwenden Sie als DBA

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

Wenn Sie sicherstellen möchten, dass nur die Sitzungen abgerufen werden, die SQL Developer verwenden, können Sie and program = 'SQL Developer' Hinzufügen. Wenn Sie nur Sitzungen beenden möchten, die einem bestimmten Entwickler gehören, können Sie eine Einschränkung für os_user Hinzufügen.

Dann töte sie mit

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

(z. B. alter system kill session '39,1232')

Eine Abfrage, die fertige kill-Anweisungen erzeugt, könnte sein

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

Dies gibt eine kill-Anweisung pro Sitzung für diesen Benutzer zurück - so etwas wie:

alter system kill session '375,64855';

alter system kill session '346,53146';

105
Sten Vesterli

Mit dieser Abfrage können Sie vorhandene Sessions in der Datenbank suchen:

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

du wirst so etwas wie unten sehen. Oracle Sessions

Führen Sie dann die folgende Abfrage mit Werten aus, die aus den obigen Ergebnissen extrahiert wurden.

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

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

17

mein Vorschlag ist dieser einfache anonyme Block:

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

Stellen Sie sicher, dass Sie das System ändern und die eingeschränkte Sitzung aktivieren, bevor Sie sie beenden. Andernfalls werden sie sich schnell wieder bei der Datenbank anmelden, bevor Sie Ihre Arbeit abschließen.

1
tc

benutze einfach SQL:

disconnect; 

conn tiger/scott as sysdba;
1

Haben Sie ALTER SYSTEM KILL SESSION ausprobiert? Rufen Sie für jede Sitzung im angegebenen Schema die SID und die SERIAL # von V $ SESSION ab

ALTER SCHEMA KILL SESSION sid, serial #;

0
Dave Costa

Nur meine zwei Cent: Der beste Weg (aber kurzfristig wahrscheinlich nicht der schnellste) wäre wahrscheinlich, dass jeder Entwickler an seiner eigenen Datenbankinstanz arbeitet (siehe Regel 1 für Datenbankarbeit ).

Die Installation von Oracle auf einer Developer Station ist seit Oracle Database 10g Express Edition ein Kinderspiel.

0
Mac