2010-11-04 3 views
6

Je dois être en mesure de supprimer un utilisateur spécifique (qui peut avoir des sessions actives) à partir du lot sans aucune intervention de l'utilisateur. Je ne me soucie pas des sessions actives et je veux qu'elles soient abandonnées et annulées. Pour Microsoft SQL je voudrais faire la même tâche avec une seule ligne:drop utilisateur cascade dans Oracle

osql -E -S localhost -b -Q "use master if ((select name from sysdatabases where name='%DB%') is not null) begin alter database [%DB%] set single_user with rollback immediate drop database [%DB%] end" 

Comment puis-je faire pour Oracle (10g XE sous Windows)?

Mon lot en cours est:

sqlplus sys/*** as SYSDBA @delete1.sql >delete.log 
sqlplus sys/***@XE as SYSDBA @delete2.sql >>delete.log 

où delete1.sql:

startup force; 
exit; 

et delete2.sql:

drop user MYUSER cascade; 
exit; 

Ce qui est laid comme l'enfer et prend trop de temps à comparer à la fraction de seconde de la solution MSSQL.

+2

Dans Oracle, un utilisateur a un schéma, donc il est beaucoup plus impliqué dans la suppression de l'utilisateur, surtout s'il y a beaucoup d'objets qui lui appartiennent. Pensez à faire un ALTER USER ... ACCOUNT LOCK et à le laisser tomber plus tard à un moment plus commode. –

+0

À quelle fréquence devez-vous laisser tomber un utilisateur - pourquoi ses performances sont-elles un problème? –

+0

Cela fait partie de mon processus CI (build -> recréer le schéma db -> exécuter les tests d'intégration) donc il est exécuté presque à chaque validation. Je peux vivre avec ses performances mais je suis choqué, Oracle n'a pas les moyens pour ça. Je ne demande pas quelque chose de spécial, suis-je? – UserControl

Répondre

3

Il devrait fonctionner si vous utilisez le script suivant (ici nommé drop_user_with_active_sessions.sql):

set verify off 

begin 

    for s in (
    select 
     sid, serial# 
    from 
     v$session 
    where 
     username = '&1' 
) loop 

    execute immediate 
     'alter system kill session ''' || 
     s.sid  || ',' || 
     s.serial# || ''' immediate'; 

    end loop; 

    execute immediate 'drop user &1'; 

end; 
/

exit 

Et la utilisez-le avec

sqlplus username/[email protected] @c:\path\to\drop_user_with_active_session.sql MYUSER 
+0

ERREUR à la ligne 1: ORA- 01940: impossible de supprimer un utilisateur actuellement connecté ORA-06512: à la ligne 19 – UserControl

0

En plus de "alter system kill session" mentionné ci-dessus, j'ai également eu besoin de préface le kill sess ion avec quelque chose comme:

execute immediate 'ALTER SYSTEM DISCONNECT SESSION ''' || 
    to_char(s.sid) || ', ' || to_char(s.serial#) || ''' IMMEDIATE' 
0

Il est très, très mauvaise idée de prendre une construction d'une plate-forme de base de données et suppose que je peux courir exactement la même chose sur une autre plate-forme. Par exemple. Oracle a une procédure Create OR REPLACE. MSSS n'est pas si simple. MSSS vous pouvez faire une table "temp" aveC#name, dans Oracle, nous utilisons DDL. Bien que laisser tomber un utilisateur pour recréer un nouvel environnement ait été l'approche la plus simple sur MSSS, il y a peut-être une façon plus centrée sur Oracle de faire la même chose. C'est une très bonne idée de demander de l'aide sur la façon d'accomplir une tâche au lieu de pourquoi votre chemin ne fonctionne pas.

D'abord, l'application testée fait-elle du DDL? aux tables et autres objets?

S'il ne fait que modifier les données, Oracle préfère que les applications fonctionnent, alors pourquoi devez-vous recréer tous les objets. Vous avez juste besoin de récupérer les données au point de départ.

Avez-vous regardé dans la base de données Flashback? Vous devriez être capable de créer un point de restauration ... faire ce que vous voulez et ensuite revenir sur la base de données à ce moment-là.

+0

Je ne suis pas un expert Oracle et je n'ai que la solution de travail (pour moi) que j'ai décrite. Je le considère moche et je me demande s'il y en a un meilleur (parce qu'il est sur un autre serveur DBMS - SQL par exemple). – UserControl

+0

Je voudrais savoir pourquoi ce n'était pas une bonne réponse. Flashback Database serait beaucoup plus facile que de laisser tomber et recréer tout. –