Невозможно удалить пользователя, который в данный момент подключен - PullRequest
5 голосов
/ 13 ноября 2010

Я пытаюсь повторно инициализировать базу данных Oracle и вижу следующую ошибку:

  [sql] Failed to execute:  drop user conns cascade
  [sql] java.sql.SQLException: ORA-01940: cannot drop a user that is currently connected
  [sql] Failed to execute:  create user conns identified by conns default tablespace tbs_conns temporary tablespace temp1
  [sql] java.sql.SQLException: ORA-01920: user name 'CONNS' conflicts with another user or role name

Проблема в том, что NO ONE подключено: это экземпляр на моем локальном компьютере.компьютер, никаких внешних подключений и я просто перезагрузился и больше ничего не запускал.Единственное, о чем я могу думать, - это то, что в Oracle может быть запущена какая-то фоновая задача (очистка?), Которая вызывает эту проблему, но я понятия не имею, как ее найти / справиться.Любые идеи?

Обновление : этот скрипт фактически удаляет и повторно инициализирует кучу таблиц, и после попытки перезапустить его несколько раз, я получил то же самое сообщение об ошибке, но в другой таблице : Failed to execute: drop user csmy cascade.После нескольких попыток он перешел на другого пользователя: Failed to execute: drop user deb cascade.Кажется, что-то блокирует эти таблицы, по одной, в алфавитном порядке!

Обновление 2 : после повторного запуска сценария примерно 15 раз - каждый раз при сбое в таблице чуть дальшев алфавите - он прошел весь путь и все работает.Я все еще хотел бы знать точно, что произошло - мое лучшее предположение - некоторый фоновый процесс Oracle, но я понятия не имею, как проверить.

Обновление 3 : я столкнулся с этой же проблемойснова в последний раз, когда я перезапустил скрипт, на этот раз не получилось "cap" пользователя.Чтобы попробовать что-то новое, я запустил sqlplus и вручную запустил команду drop user cap cascade, и, о чудо, она работала просто отлично.Я попробовал сценарий, и он подошел к завершению.Поэтому, поскольку удаление пользователя вручную работает без проблем, я сильно подозреваю, что виноват сам скрипт.

Ответы [ 5 ]

1 голос
/ 13 ноября 2010

Вы запрашивали у v $ session, чтобы узнать, кто подключен?Возможно, где-то запущено приложение, которое автоматически подключается заново.Вы всегда можете запустить базу данных в ограниченном режиме или не запускать прослушиватель и запускать скрипт из локального соединения.

1 голос
/ 13 ноября 2010

Использует ли скрипт одинаковое соединение? Пробует ли он одновременно отбросить нескольких пользователей?

Похоже, что при обнаружении ошибки он просто переходит к следующему шагу.

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

0 голосов
/ 11 февраля 2011

Возможно, если бы вы попробовали

ALTER SYSTEM DISCONNECT SESSION '<sid>,<serial#>' IMMEDIATE 

(для каждого сеанса пользователя, который вы пытаетесь удалить), перед удалением пользователя это сработало бы?

Просто угадай.

0 голосов
/ 21 ноября 2010

Не видя ваш сценарий, трудно сказать точно, что происходит.Но я могу заверить вас, что сама база данных никогда не подключается к конкретным пользователям.

Что вы можете сделать, это позволить вашему коду войти в систему (я предполагаю, что ваш код работает как пользователь DBA) и пройти через всех пользователей, которых вы хотитепонижаться.Для каждого из них выполните команду REVOKE CREATE SESSION FROM, которая отключает вход в систему, поэтому любой загадочный код не сможет подключиться.

0 голосов
/ 13 ноября 2010
  1. Проверьте, все ли соединения правильно закрыты в случае исключения.

  2. Посмотрите на свойства соединения JDBC. Если пул соединений или кэширование включены, некоторые соединения из предыдущего запуска могут все еще оставаться живыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...