Oracle
Java 應用程序拒絕連接
我嘗試從我的小 Java 類連接到 Oracle11g 數據庫,但連接被拒絕並出現 SQL 錯誤。
從客戶端(SQL Developer)連接有效。
這是我嘗試執行 java 類時的錯誤:
java.sql.SQLException: ORA-00604: errore riscontrato in SQL ricorsivo livello 1 ORA-20001: Denied! You are not allowed to logon the database ORA-06512: a line 19 at oracle.jdbc.driver.T4CTTIo`enter code here`er.processError(T4CTTIoer.java:447) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:389) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:382) at oracle.jdbc.driver.T4CTTIfun.processError(T4CTTIfun.java:675) at oracle.jdbc.driver.T4CTTIoauthenticate.processError(T4CTTIoauthenticate.java:448) at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:513) at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:227) at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:383) at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:776) at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:432) at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:553) at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:254) at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:528) at java.sql.DriverManager.getConnection(DriverManager.java:664) at java.sql.DriverManager.getConnection(DriverManager.java:247) at DBConnection.setDBConnection(DBConnection.java:48) at Main.main(Main.java:31)
這是我的連接類的程式碼:
String host = "xxx"; String service = "xxx"; String username = "xxx"; String password = "xxx"; if(host != null && username != null && password != null) { // Establishing DB Connection try { connection = DriverManager.getConnection( "jdbc:oracle:thin:@" + host + ":1521/" + service , username, password); ...
似乎 DBA 創建了一個登錄觸發器來驗證登錄時的連接。ORA-20001-20999 是由拋出它們的程式碼定義的自定義異常,這是一個環境問題,請詢問 DBA。
如果你有必要的權限,你可以自己檢查觸發器,你可以從:
select * from dba_triggers where triggering_event like 'LOGON%';
我的猜測是有一個登錄觸發器可以檢查應用程序名稱。顯然是由不了解應用程序名稱不能依賴的人編寫的。
以下建議可能會給您帶來麻煩,請謹慎使用!
Oracle 的 JDBC 驅動程序允許您通過連接屬性指定應用程序名稱。
SQL Developer 使用相同的方法來設置它自己的應用程序名稱(否則它會簡單地顯示為“JDBC Thin Driver”)。
要提供非預設應用程序名稱,您可以使用以下 Java 程式碼:
String host = "xxx"; String service = "xxx"; String username = "xxx"; String password = "xxx"; Properties props = new Properties(); props.put("username", username); props.put("password", password); props.put("v$session.program", "SQL Developer"); // this sets the application name try { connection = DriverManager.getConnection("jdbc:oracle:thin:@" + host + ":1521/" + service, props); ... } ...
JavaDocs 還列出了幾個其他屬性,可用於為
v$session
視圖中的某些列提供資訊。儘管如上面的程式碼所示,登錄觸發器幾乎毫無意義,但您仍然應該首先與負責此操作的人交談。
再說一遍:如果你繞過這個檢查,它可能會給你帶來嚴重的麻煩。