Oracle

Java 應用程序拒絕連接

  • January 26, 2022

我嘗試從我的小 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視圖中的某些列提供資訊。


儘管如上面的程式碼所示,登錄觸發器幾乎毫無意義,但您仍然應該首先與負責此操作的人交談。

再說一遍:如果你繞過這個檢查,它可能會給你帶來嚴重的麻煩。

引用自:https://dba.stackexchange.com/questions/233923