无法删除当前连接的用户

时间:2010-11-12 21:59:25

标签: oracle oracle11g

我正在尝试重新初始化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 :我上次重新运行脚本时又遇到了同样的问题,这次用户“上限”失败了。为了尝试新的东西,我启动了sqlplus并手动运行drop user cap cascade命令,并且看,它工作得很好。我尝试了脚本,它运行完成。因此,由于手动删除用户没有问题,我强烈怀疑脚本本身应该受到责备。

5 个答案:

答案 0 :(得分:1)

脚本是否使用相同的连接?是否尝试顶级同时丢弃多个用户?

看起来如果遇到错误,它只会继续下一步。

在不同模式中的对象之间可能存在依赖关系,这可能会阻止模式A中的对象被删除,直到模式B中的对象被删除。因此,如果最初可能无法删除模式A,但是如果模式B已被删除则重试成功。

答案 1 :(得分:1)

您是否从v $ session查询了哪些人已连接?您可能有一个应用程序在某个位置自动重新连接。您始终可以在受限模式下启动数据库,或者不启动侦听器并从本地连接运行脚本。

答案 2 :(得分:0)

  1. 检查是否在发生异常时正确关闭了所有连接。

  2. 查看JDBC连接属性。 如果启用了连接池或缓存,则先前运行的某些连接可能仍处于活动状态。

答案 3 :(得分:0)

如果没有看到你的剧本,就很难确切知道会发生什么。但我可以向您保证,数据库本身永远不会连接到特定用户。

您可以做的是让您的代码登录(我假设您的代码以DBA用户身份运行)并循环浏览您要删除的所有用户。对于每个,发出REVOKE CREATE SESSION FROM 这会禁用登录,因此任何神秘的代码都无法连接。

答案 4 :(得分:0)

也许,如果你试过

ALTER SYSTEM DISCONNECT SESSION '<sid>,<serial#>' IMMEDIATE 
在删除用户之前,

(对于您尝试删除的每个用户的会话),它会有效吗?

只是猜测。