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?
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';
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.
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 ';
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;
/
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é.
utilisez simplement SQL:
disconnect;
conn tiger/scott as sysdba;
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;
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 .