2010-11-04 16 views
6

Devo essere in grado di rilasciare un utente specifico (che potrebbe avere sessioni attive) dal batch senza alcuna interazione dell'utente. Non mi importa delle sessioni attive e voglio che vengano lasciate cadere e rotolate indietro. Per Microsoft SQL farei operazione simile con una sola riga:drop user cascade in 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" 

Come faccio lo faccio per Oracle (10g XE su Windows)?

mio batch corrente è:

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

dove delete1.sql:

startup force; 
exit; 

e delete2.sql:

drop user MYUSER cascade; 
exit; 

Questo è brutto come l'inferno e prende troppo tempo a confronto alla frazione di secondo della soluzione MSSQL.

+2

In Oracle un utente ha uno schema, quindi è molto più impegnato a far cadere l'utente, specialmente se ci sono molti oggetti di sua proprietà. Considera di eseguire ALTER USER ... ACCOUNT LOCK e poi rilasciarlo più tardi in un momento più conveniente. –

+0

Quante volte hai bisogno di eliminare un utente - perché le sue prestazioni sono un problema? –

+0

Questo fa parte del mio processo CI (build -> ricrea lo schema db -> esegue test di integrazione) quindi viene eseguito quasi su ogni commit. Posso vivere con le sue prestazioni ma sono scioccato che Oracle non ha mezzi per questo. Non sto chiedendo qualcosa di speciale, vero? – UserControl

risposta

3

Dovrebbe funzionare se si utilizza il seguente script (qui chiamato 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 

E il utilizzarlo con

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

ERROR alla riga 1: ORA- 01940: impossibile disconnettere un utente attualmente connesso ORA-06512: alla riga 19 – UserControl

0

Oltre a "alter sessione del sistema kill" di cui sopra ho anche bisogno di precedere l'uccidere Sess ione con qualcosa di simile:

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

E 'molto, molto cattiva idea di prendere un costrutto da una piattaforma di database e presumo posso correre la stessa cosa su una piattaforma diversa. Per esempio. Oracle ha la procedura CREAZIONE O SOSTITUZIONE. MSSS non è così semplice. MSSS puoi creare una tabella "temp" con #name, in Oracle usiamo DDL. Mentre abbandonare un utente per ricreare un nuovo ambiente potrebbe essere stato l'approccio più semplice su MSSS, forse c'è un modo più incentrato su Oracle per realizzare la stessa cosa. È una buona idea chiedere aiuto su come eseguire un compito invece del perché il tuo modo non funziona.

Innanzitutto, l'app in prova esegue DDL? ai tavoli e altri oggetti?

Se cambia solo i dati, il modo in cui Oracle preferisce le app funziona, quindi perché è necessario ricreare tutti gli oggetti. Hai solo bisogno di riportare i dati al punto di partenza.

Hai esaminato il database di Flashback? Dovresti essere in grado di creare un punto di ripristino ... fai quello che vuoi e poi ritorni a flashback del database fino a quel momento.

+0

Non sono esperto Oracle e ho solo la soluzione funzionante (per me) che ho descritto. Lo considero brutto e mi chiedo se ce n'è uno migliore (perché è su altri DBMS - SQL server come esempio). – UserControl

+0

Vorrei sapere perché questa non era una buona risposta. Il database di Flashback sarebbe molto più facile che abbandonare e ricreare tutto. –