сбросить каскад пользователей в Oracle - PullRequest
6 голосов
/ 04 ноября 2010

Мне нужно иметь возможность удалить конкретного пользователя (который может иметь активные сеансы) из пакета без какого-либо взаимодействия с пользователем .Мне нет дела до активных сессий, и я хочу, чтобы их отбрасывали и откатывали.Для 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 ]

3 голосов
/ 07 января 2011

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

Это очень, очень плохая идея взять конструкцию из одной платформы базы данных и предположить, что я могу запустить точно такую ​​же вещь на другой платформе.Например.Oracle имеет процедуру Создать или заменить.MSSS не совсем так просто.MSSS вы можете создать временную таблицу с #name, в Oracle мы используем DDL.Хотя удаление пользователя для воссоздания новой среды, возможно, было самым простым подходом в MSSS, возможно, существует более ориентированный на Oracle способ достижения той же цели.Хорошая идея - попросить помощи о том, как выполнить задачу, а не о том, почему ваш путь не работает.

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

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

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

0 голосов
/ 07 января 2011

В дополнение к упомянутому выше «изменению системного сеанса уничтожения», мне также необходимо было предвосхитить сеанс уничтожения примерно так:

execute immediate 'ALTER SYSTEM DISCONNECT SESSION ''' ||
    to_char(s.sid) || ', ' || to_char(s.serial#) || ''' IMMEDIATE'
0 голосов
/ 04 ноября 2010

вы можете выполнить Oracle SQL через командную строку , а затем выполнить каскадное удаление пользователя .

Я бы порекомендовал создать сценарий sql и выполнить это из командной строки .

, тогда вы можете заключить текст командной строки в ваш cmd / batch-файл.

, но если вы хотите, чтобы Oracle обрабатывал весь процесс, я бы порекомендовалзаглядывая в среду работы / расписания

...