2008-09-17 8 views
53

Existe-t-il un meilleur moyen de déconnecter de force tous les utilisateurs d'un schéma de base de données Oracle 10g que de redémarrer les services de base de données Oracle?Suppression d'un utilisateur connecté d'un schéma de base de données Oracle 10g

Nous avons plusieurs développeurs utilisant SQL Developer se connectant au même schéma sur un seul serveur Oracle 10g. Le problème est que lorsque nous voulons supprimer le schéma pour le reconstruire, inévitablement quelqu'un est toujours connecté et nous ne pouvons pas abandonner le schéma de base de données ou l'utilisateur pendant que quelqu'un est encore connecté. Par ailleurs, nous ne souhaitons pas abandonner toutes les connexions à d'autres schémas, car d'autres personnes peuvent toujours être connectées et tester avec ces schémas.

Quelqu'un connaît un moyen rapide de résoudre ce problème?

Répondre

97

Pour trouver les sessions, comme une utilisation DBA

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

Si vous voulez être sûr que pour obtenir les sessions qui utilisent SQL Developer, vous pouvez ajouter and program = 'SQL Developer'. Si vous voulez seulement tuer les sessions appartenant à un développeur spécifique, vous pouvez ajouter une restriction à os_user

ensuite les tuer avec

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

(par exemple alter system kill session '39,1232')

A La requête qui produit des instructions kill prêtes à l'emploi peut être

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

Ceci renvoie une instruction kill par session pour cet utilisateur - quelque chose comme:

alter system kill session '375,64855';

alter system kill session '346,53146';

+0

J'ai trouvé que dans notre environnement RAC, tuant la session souvent laissé traîner, mais de trouver le numéro de processus et de le tuer à partir du système d'exploitation toujours travaillé . – Jonathan

+4

petite addition - ajouter immédiatement à la commande: 'select 'alter système kill session' '' || sid || ',' || numéro de série || '' 'immédiat " à partir de v $ session où username = ''; 'ceci va forcer la commande – Michael

+0

bonne réponse. Exactement ce que je cherchais. –

0

Avez-vous essayé ALTER SYSTEM KILL SESSION? Obtenez le SID et de série de V SESSION $ pour chaque session dans le schéma donné, puis faire

KILL SESSION ALTER SCHEMA sid, série #;

0

Juste mes deux cents: la meilleure façon (mais probablement pas le plus rapide à court terme) serait probablement que chaque développeur travaille sur sa propre instance de base de données (voir rule #1 for database work).

L'installation d'Oracle sur une station de développement est devenue un jeu d'enfant depuis Oracle Database 10g Express Edition.

+0

Uniquement pour Windows et certaines versions de Linux. –

+0

Ce n'est pas vraiment pertinent à la question? – Konrads

+0

Ce n'est peut-être pas la réponse que le chercheur recherchait et je peux parfaitement comprendre pourquoi il n'a pas été fortement mis à jour, mais je pense qu'il est très pertinent compte tenu du cas d'utilisation qu'il a spécifiquement mis en avant. Plusieurs développeurs travaillant sur la même base de données est une très mauvaise idée, et ce problème n'est certainement pas le pire qui puisse arriver. – Mac

1

Assurez-vous que vous modifiez le système et activez la session restreinte avant de les supprimer ou qu'ils se reconnecteront rapidement à la base de données avant la fin de votre travail.

+2

Il pourrait être plus facile et moins intrusif de verrouiller l'utilisateur qu'il a l'intention de supprimer, puis de supprimer toutes les sessions connectées de cet utilisateur, puis de le supprimer et de le recréer. Pas besoin de restreindre inutilement l'accès aux autres utilisateurs. –

1

il suffit d'utiliser SQL:

disconnect; 

conn tiger/scott as sysdba; 
15

Trouver les sessions existantes à DB en utilisant cette requête:

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

vous verrez quelque chose comme ci-dessous. Oracle Sessions

Ensuite, exécutez la requête ci-dessous avec les valeurs extraites des résultats ci-dessus.

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

Ex: KILL SESSION SYSTÈME ALTER '93, 943' ;

7

ma proposition est ce simple bloc anonyme:

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

mieux de noter ospid avant de tuer des sessions, ils peuvent être bloqués – user3380585

Questions connexes