我正在试图弄清楚为什么我的应用程序无法成功解锁用户的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
或报告任何问题,但用户的帐户实际上并未解锁。我是否遗漏了一些明显的东西,或者是否有一些巧妙的方法让它发挥作用?
答案 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注入攻击的可能性