2009-10-22 37 views
1

我想弄清楚爲什麼我的應用程序無法成功解鎖用戶的Oracle帳戶。下面是我的代碼片段:如何從Java解鎖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

什麼是數據庫版本?您是否在SQL Plus中嘗試了這個命令? – Guru 2009-10-22 05:45:58

+0

Oracle 10g語句在SQL * Plus中完美工作。 – ninesided 2009-10-22 07:08:06

回答

2

我很擔心有一個像sysdba這樣的應用程序連接。

我希望有一個具有ALTER USER權限的特權用戶,從中刪除CREATE SESSION特權,並讓此架構包含一個account_unlock pl/sql過程,爲其授予應用程序連接的用戶的執行特權用。 ALTER USER是強大的東西,你可能想限制你的應用程序可以改變的屬性,甚至個人用戶。

而且這也可能解決這個問題。

+1

我全心全意同意,不幸的是我有一個具體的要求,需要這種方法。該應用程序旨在作爲一個簡單的支持工具,並將永遠只能鎖定/解鎖用戶帳戶並更改用戶的密碼。 – ninesided 2009-10-22 07:03:58

+0

我已經改變了應用程序以使用特權用戶而不是像你所建議的那樣以sysdba連接,我想出了一種不同的方式來滿足必須使用sysdba的其他需求。雖然我無法解釋爲什麼它以前沒有工作,但現在確實如此。非常好! – ninesided 2010-01-27 17:44:54

0

我會好奇,看看是否能解決問題:

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

+0

可悲的是沒有。它運行,但不會影響帳戶狀態更改。 – ninesided 2009-10-22 02:20:45

1

嘗試使用executeUpdate而不是僅執行。例如

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

我以爲你可能一直在這裏,但它沒有區別... – ninesided 2009-10-22 06:59:16

0

嘗試設置'自動提交'屬性'真'您的JDBC連接。可能是默認設置爲'false',並且您的sql未提交。

+0

提交不需要爲ALTER用戶 – ninesided 2009-10-22 06:59:52

1

這不是「提交」問題,因爲此語句不需要提交。需要考慮的事項:

當您在SQLPLUS中運行它時,該語句是否解鎖帳戶? 您是否從java登錄到正確的數據庫? 有沒有一些程序試圖登錄賬戶,導致賬戶被鎖定,導致錯誤的憑據?

+0

感謝您的建議。該聲明在SQL * Plus中完美工作,我已經檢查了數十次數據庫的連接細節,並且它絕對是正確的數據庫,沒有其他進程可以進行此更改,而不是我試圖測試的那個進程。 – ninesided 2009-10-22 07:10:15

0

好消息是你的代碼應該可以工作 - 我只是做了一個快速測試,目標賬戶被解鎖了。兩個問題浮現在腦海中:

  • 你是如何判斷賬戶 仍處於鎖定狀態?您是否使用 SELECT用戶名,account_status FROM DBA_USERS

  • 是否存在Oracle配置文件鎖定失敗登錄嘗試帳戶?也許有另外一個進程試圖連接失敗的密碼並重新鎖定帳戶。

對不起,提出這樣的基本問題,但再次,你的代碼確實工作。

0

也許您遇到了Oracle 11中的一個區分大小寫問題?

0

通過執行包內的動態sql的可調用語句來更安全。通過這種方式,您可以在一個包上執行執行,從而消除SQL注入攻擊的可能性。

+2

這不是接受的答案建議的嗎? – 2012-08-14 21:19:36