2010-11-04 14 views
6

Necesito poder eliminar un usuario específico (que puede tener sesiones activas) del lote sin interacción del usuario. No me preocupan las sesiones activas y quiero que se descarten y se retrotraigan. Para Microsoft SQL que haría tarea similar con una sola línea:soltar cascada de usuario en 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" 

¿Cómo lo hago para Oracle (10g XE en Windows)?

Mi lote actual es:

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

donde delete1.sql:

startup force; 
exit; 

y delete2.sql:

drop user MYUSER cascade; 
exit; 

Esto es feo como el infierno y lleva demasiado tiempo comparando a la fracción de segundo de la solución MSSQL.

+2

En Oracle, un usuario tiene un esquema, por lo que hay mucho más involucrado en eliminar al usuario, especialmente si hay muchos objetos que pertenecen a él. Considere hacer un ALTER USER ... ACCOUNT LOCK y luego soltarlo más tarde en un momento más conveniente. –

+0

¿Con qué frecuencia necesita dejar caer a un usuario? ¿Por qué su rendimiento es un problema? –

+0

Esto es parte de mi proceso de CI (compilar -> volver a crear el esquema db -> ejecutar pruebas de integración) por lo que se ejecuta casi en cada confirmación. Puedo vivir con su rendimiento pero estoy sorprendido de que Oracle no tenga medios para esto. No estoy preguntando algo especial, ¿verdad? – UserControl

Respuesta

3

Se debe trabajar si se utiliza la siguiente secuencia de comandos (aquí llamado 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 

Y el úselo con

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

ERROR en la línea 1: ORA- 01940: no se puede colocar a un usuario que está actualmente conectado ORA-06512: en la línea 19 – UserControl

0

Además de "Alter System kill session" mencionado anteriormente también he necesitado prefacio the kill sess iones con algo como:

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

Es una muy, muy mala idea tomar una construcción de una plataforma de base de datos y asumo que puedo correr exactamente lo mismo en una plataforma diferente. Por ejemplo. Oracle tiene el procedimiento Create OR REPLACE. MSSS no es tan simple. MSSS puede hacer una tabla "temporal" con #name, en Oracle usamos DDL. Si bien la eliminación de un usuario para recrear un nuevo entorno puede haber sido el enfoque más simple en MSSS, tal vez haya una forma más centrada en Oracle para lograr lo mismo. Es una muy buena idea pedir ayuda sobre cómo llevar a cabo una tarea en lugar de por qué su camino no está funcionando.

Primero, ¿la aplicación que se está probando hace DDL? a las tablas y otros objetos?

Si solo cambia los datos, la forma en que Oracle prefiere que las aplicaciones funcionen, entonces ¿por qué tiene que volver a crear todos los objetos? Solo necesita recuperar los datos al punto de partida.

¿Ha consultado en la base de datos de Flashback? Debería poder crear un punto de restauración ... hacer lo que quiera y luego retroceder la base de datos a ese punto en el tiempo.

+0

No soy experto en Oracle y solo tengo la solución de trabajo (para mí) que describí. Lo considero feo y me pregunto si hay uno mejor (porque está en otro servidor DBMS - SQL como ejemplo). – UserControl

+0

Desearía saber por qué esta no fue una buena respuesta. La base de datos de Flashback sería mucho más fácil que dejar caer y recrear todo. –

Cuestiones relacionadas