如何从Java解锁Oracle用户的帐户?

时间:2009-10-22 01:42:31

标签: java oracle jdbc sysadmin

我正在试图弄清楚为什么我的应用程序无法成功解锁用户的Oracle帐户。这是我的代码片段:

OracleDataSource ods = new oracle.jdbc.pool.OracleDataSource();

Properties props = new Properties();
props.put("user", "sys");
props.put("password", "sys");
props.put("internal_logon", "sysdba");

ods.setConnectionProperties(props);
ods.setURL("jdbc:oracle:thin:@localhost:1523:TEST_DB");

Connection conn = ods.getConnection();
Statement stmt = conn.createStatement();
stmt.execute("ALTER USER SCOTT ACCOUNT UNLOCK");
stmt.close();

它不会引发SQLException或报告任何问题,但用户的帐户实际上并未解锁。我是否遗漏了一些明显的东西,或者是否有一些巧妙的方法让它发挥作用?

8 个答案:

答案 0 :(得分:2)

我非常担心将应用程序连接为sysdba就像这样。

我希望有一个特权用户拥有ALTER USER的权限,从中删除CREATE SESSION权限,并让此模式包含一个account_unlock pl / sql过程,为您的应用程序连接的用户授予执行权限。 ALTER USER是功能强大的东西,您可能希望限制属性,甚至是应用程序可以更改的各个用户。

这也可能解决这个问题。

答案 1 :(得分:1)

尝试使用executeUpdate而不仅仅是执行。 e.g。

stmt.executeUpdate("ALTER USER SCOTT ACCOUNT UNLOCK")

答案 2 :(得分:1)

这不是“提交”问题,因为此语句不需要提交。需要考虑的事项:

当您在SQLPLUS中运行该语句时,该语句是否会解锁该帐户? 您是否从java登录到正确的数据库? 是否有某些进程尝试使用错误的凭据登录到帐户,从而导致锁定帐户?

答案 3 :(得分:0)

我很想知道这是否可以解决问题:

stmt.execute(“BEGIN EXECUTE IMMEDIATE'ALTER USER SCOTT ACCOUNT UNLOCK'; ​​END;”);

答案 4 :(得分:0)

尝试为您的jdbc连接将'autocommit'属性设置为'true'。可能是默认设置为'false'并且你的sql没有提交。

答案 5 :(得分:0)

好消息是你的代码应该运行 - 我只是对它进行了快速测试,目标帐户已解锁。我想到两个问题:

  • 您是如何确定帐户的? 仍被锁定?你正在用吗 SELECT用户名,account_status FROM DBA_USERS

  • 是否有Oracle配置文件锁定帐户以进行失败的登录尝试?也许有 另一个进程尝试并且无法使用重新锁定帐户的错误密码进行连接。

很抱歉提出这些基本问题,但您的代码确实有用。

答案 6 :(得分:0)

也许您遇到了Oracle 11的区分大小写问题?

答案 7 :(得分:0)

通过在包中执行动态sql的可调用语句来实现它会更安全。这样就可以在包上授予执行权,从而消除SQL注入攻击的可能性