2010-11-04 4 views
6

Мне нужно убрать определенного пользователя (который может иметь активные сеансы) из пакета без какого-либо взаимодействия с пользователем. Я не забочусь о активных сеансах и хочу, чтобы их отбрасывали и откатывали назад. Для Microsoft SQL я бы подобную задачу с одной строкой:drop user cascade в 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" 

Как я могу сделать это для Oracle (10g XE на Windows)?

Моя текущая партия является:

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

где delete1.sql:

startup force; 
exit; 

и delete2.sql:

drop user MYUSER cascade; 
exit; 

Это некрасиво, как ад, и занимает слишком много времени по сравнению до второй секунды решения MSSQL.

+2

В Oracle у пользователя есть схема, поэтому в выпадении пользователя гораздо больше участвует, особенно если есть много объектов, принадлежащих ему. Подумайте об использовании ALTER USER ... ACCOUNT LOCK, а затем опустите его позже в более удобное время. –

+0

Как часто вам нужно отказаться от пользователя - почему его производительность является проблемой? –

+0

Это часть моего процесса CI (build -> recreate the db schema -> run integration tests), поэтому он выполняется почти на каждом коммите. Я могу жить с его производительностью, но я в шоке, у Oracle нет средств для этого. Я не спрашиваю что-то особенное, а? – UserControl

ответ

3

Он должен работать, если использовать следующий скрипт (здесь названный 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 

И используйте его с

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

ОШИБКА по строке 1: ORA- 01940: не удается удалить пользователя, который в настоящее время подключен ORA-06512: в строке 19 – UserControl

0

вы можете сделать Oracle SQL via the command prompt, а затем сделать свой cascade drop user.

Я бы порекомендовал создать sql-скрипт и executing it from the command line.

тогда вы можете обернуть текст командной строки в вашем файле cmd/batch.

, но если вы хотите, Oracle обрабатывать весь процесс, который я рекомендовал бы глядя в job/schedule environment

0

В дополнение к «переустановке смены системы», упомянутому выше, мне также необходимо было предисловие к убийству sess иона с чем-то вроде:

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

Это очень, очень плохая идея взять конструкцию из одной платформы баз данных и предположим, что я могу запустить ту же самую вещь на другой платформе. Например. У Oracle есть процедура Create OR REPLACE. MSSS не так проста. MSSS вы можете создать таблицу «temp» с #name, в Oracle мы используем DDL. Хотя отказ от создания новой среды, возможно, был самым простым подходом к MSSS, возможно, существует более ориентированный на Oracle способ сделать то же самое. Очень хорошая идея попросить помощи о том, как выполнить задачу, а не почему ваш путь не работает.

Во-первых, проверяется ли приложение DDL? к таблицам и другим объектам?

Если он только изменяет данные, они предпочитают, чтобы приложения работали, то почему вам нужно воссоздать все объекты. Вам просто нужно вернуть данные в исходную точку.

Вы изучили базу данных Flashback? Вы должны иметь возможность создать точку восстановления ... делать все, что хотите, а затем мгновенно восстанавливать базу данных до этого момента.

+0

Я не эксперт Oracle и имею только рабочее (для меня) решение, которое я описал. Я считаю это уродливым и задаюсь вопросом, есть ли лучший («потому что это на другом СУБД - SQL-сервер в качестве примера»). – UserControl

+0

Хотел бы я знать, почему это был не очень хороший ответ. База данных Flashback будет намного проще, чем сбросить и воссоздать все. –

Смежные вопросы