web-dev-qa-db-fra.com

Suppression d'un utilisateur connecté à partir d'un schéma de base de données Oracle 10g

Existe-t-il un meilleur moyen de déconnecter de manière forcée tous les utilisateurs d'un schéma de base de données Oracle 10g plutôt que de redémarrer les services de base de données Oracle?

Plusieurs développeurs utilisant SQL Developer se connectent 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, il est inévitable qu'une personne soit toujours connectée et nous ne pouvons pas supprimer le schéma de la base de données ou l'utilisateur tant qu'une personne est toujours connectée.

De même, nous ne voulons 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?

61
Joshua Starner

Pour trouver les sessions, en tant qu'utilisateur DBA

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

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

Puis tuez-les avec

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

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

Une requête qui produit des instructions kill prêtes à l'emploi pourrait être

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

Cela renverra une instruction kill par session pour cet utilisateur - quelque chose comme:

alter system kill session '375,64855';

alter system kill session '346,53146';

105
Sten Vesterli

Recherchez les sessions existantes dans la base de données à l'aide de 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: ALTER SYSTEM KILL SESSION '93, 943 ';

17
Chand Priyankara

ma proposition est ce simple bloc anonyme:

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

Assurez-vous de modifier le système et d'activer les sessions restreintes avant de les tuer, sinon ils se reconnecteront rapidement à la base de données avant que votre travail ne soit terminé.

1
tc

utilisez simplement SQL:

disconnect; 

conn tiger/scott as sysdba;
1
LinuxQuestions.org

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

ALTER SCHEMA KILL SESSION sid, numéro de série;

0
Dave Costa

Juste mes deux cents: la meilleure façon (mais probablement pas la plus rapide à court terme) serait probablement que chaque développeur travaille sur sa propre instance de base de données (voir règle n ° 1 pour le travail sur la base de données ).

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

0
Mac