老Java项目访问提示orcale 19c ORA-01017: 用户名/口令无效; 登录被拒绝
orcale 19c ORA-01017: 用户名/口令无效; 登录被拒绝
因为是个老Java项目,jdk1.6,用的ojdbc14,
项目数据库xml配置:
<connection-url>jdbc:oracle:thin:@//127.0.0.1:1521/orclpdb</connection-url>
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<user-name>EFMP</user-name>
<password>EFMP</password>--!!注意大小写
orclpdb 这里是我使用了PDB数据库查询的服务名,可根据本地情况做相应调整
show pdbs;
之所以说用户名注意大小写是因为
19C设置sec_case_sensitive_logon参数为false会导致除sys用户以外的所有用户都无法以原来的密码登录,登录时提示:密码不对
打开cmd窗口,此处也可以用sqlplus / as sysdba
修改方法
C:\Users\Administrator>sqlplus EFMP/EFMP@//127.0.0.1:1521/orclpdbSQL*Plus: Release 19.0.0.0.0 - Production on 星期一 9月 29 16:37:33 2025
Version 19.3.0.0.0Copyright (c) 1982, 2019, Oracle. All rights reserved.上次成功登录时间: 星期一 9月 29 2025 14:38:50 +08:00连接到:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0SQL>
SQL> show parameter caseNAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
sec_case_sensitive_logon boolean
TRUE
alter system set sec_case_sensitive_logon=false;
启动项目后提示:
ORA-01017: 用户名/口令无效; 登录被拒绝
一开始我以为是ojdbc的问题于是在本地写了个测试类,显示能登录但是提示用户名密码错误
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class TestOracle {// Oracle数据库连接信息private static final String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver";// 使用服务名连接方式(新版本推荐)// private static final String DB_URL = "jdbc:oracle:thin:@//localhost:1521/ORCLPDB";private static final String USER = "EFMP";private static final String PASS = "EFMP";public static void main(String[] args) {Connection conn = null;Statement stmt = null;try {// 1. 注册JDBC驱动Class.forName(JDBC_DRIVER);// 2. 打开连接System.out.println("连接Oracle数据库...");conn = DriverManager.getConnection(DB_URL, USER, PASS);// 3. 执行查询System.out.println("创建Statement对象...");stmt = conn.createStatement();String sql = "SELECT employee_id, first_name, last_name, salary FROM employees";ResultSet rs = stmt.executeQuery(sql);// 4. 处理结果集while(rs.next()) {// 通过字段名获取int empId = rs.getInt("employee_id");String firstName = rs.getString("first_name");String lastName = rs.getString("last_name");double salary = rs.getDouble("salary");// 输出数据System.out.print("员工ID: " + empId);System.out.print(", 姓名: " + firstName + " " + lastName);System.out.println(", 薪资: " + salary);}// 5. 关闭资源rs.close();stmt.close();conn.close();} catch(SQLException se) {// 处理JDBC错误se.printStackTrace();} catch(Exception e) {// 处理Class.forName错误e.printStackTrace();} finally {// 关闭资源try {if(stmt != null) stmt.close();} catch(SQLException se2) {} // 什么都不做try {if(conn != null) conn.close();} catch(SQLException se) {se.printStackTrace();}}System.out.println("Oracle数据库操作完成!");}
}
解决方法:
1.修改数据库sqlnet.ora文件(在我机器上的位置是:C:\Orcale\WINDOWS.X64_193000_db_home\network\admin\sqlnet.ora),后面新增两行:
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
SQLNET.ALLOWED_LOGON_VERSION=8
2.重新设置密码(因为步骤1修改了安全策略,需要通过修改密码来适配新的安全策略以让我们的老代码能也能正常访问):这一步很重要!!!我就是卡在这一步,最后抱着试试的心态结果成功了!!!!以为第一步不用重启就能生效,但是事实并不是。
打开控制台连接到数据库输入:
alter user [用户名] identified by [密码];
这是在重启一下本地项目就OK啦!
原文链接:https://blog.csdn.net/qq_38597400/article/details/105174470