Сбросить каскад пользователя в Oracle
Мне нужно иметь возможность удалить конкретного пользователя (который может иметь активные сеансы) из пакета без какого-либо взаимодействия с пользователем. Мне нет дела до активных сессий, и я хочу, чтобы их отбрасывали и откатывали. Для Microsoft SQL я бы сделал аналогичную задачу в одну строку:
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.
4 ответа
Это должно работать, если вы используете следующий скрипт (здесь с именем 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/password@instance @c:\path\to\drop_user_with_active_session.sql MYUSER
Это очень, очень плохая идея - взять конструкцию из одной платформы базы данных и предположить, что я могу запустить точно такую же вещь на другой платформе. Например. Oracle имеет процедуру Создать или заменить. MSSS не совсем так просто. MSSS вы можете создать временную таблицу с #name, в Oracle мы используем DDL. В то время как удаление пользователя для воссоздания новой среды, возможно, было самым простым подходом в MSSS, возможно, есть более ориентированный на Oracle способ сделать то же самое. Хорошая идея - попросить помощи о том, как выполнить задачу, а не о том, почему ваш путь не работает.
Во-первых, тестирует ли приложение DDL? на столы и другие объекты?
Если это только изменяет данные, то, как Oracle предпочитает работать приложения, тогда зачем вам заново создавать все объекты. Вам просто нужно вернуть данные в исходную точку.
Вы смотрели в базу данных Flashback? Вы должны быть в состоянии создать точку восстановления... делать все, что вы хотите, а затем перенастроить базу данных к этому моменту времени.
В дополнение к упомянутому выше "изменению сеанса уничтожения системы", мне также нужно было предвосхитить сеанс уничтожения примерно так:
execute immediate 'ALTER SYSTEM DISCONNECT SESSION ''' ||
to_char(s.sid) || ', ' || to_char(s.serial#) || ''' IMMEDIATE'
Вы можете выполнить Oracle SQL через командную строку, а затем выполнить каскадный сброс пользователя.
Я бы порекомендовал создать сценарий sql и выполнить его из командной строки.
Затем вы можете заключить текст командной строки в ваш командный файл.
но если вы хотите, чтобы Oracle обрабатывал весь процесс, я бы порекомендовал изучить среду работы / расписания