Сбросить каскад пользователя в 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 обрабатывал весь процесс, я бы порекомендовал изучить среду работы / расписания

Другие вопросы по тегам