结论:升级后ORA-01017报错主因是密码版本(如仅10G)、认证协议(需设SQLNET.ALLOWED_LOGON_VERSION_SERVER=8)与profile限制(如PASSWORD_VERIFY_FUNCTION)三者错配,而非密码错误或权限丢失;必须先重置无双引号密码、降级协议、清空验证函数,登录成功后权限才生效。

直接说结论:升级后用户“能连但没权限”或“连都连不上”,90%不是权限丢了,而是密码版本、认证协议、profile限制三者错配导致的登录拦截——你得先让账号能通过校验,权限才生效。
ORA-01017 登录失败但密码没改过
这是最典型的表象。升级后用原密码登录报 ORA-01017,不是密码错了,是 Oracle 19c 默认只接受 11G 和 12C 密码哈希,而 11g 用户旧密码只有 10G 版本(不区分大小写)。查一眼就知道:
SELECT username, password_versions FROM dba_users WHERE username = 'SCOTT';
如果返回值只有 10G,说明该用户还没被“重认证”过。此时单改 sec_case_sensitive_logon=false 没用,必须配合协议降级和密码重置。
- 编辑服务器端
$ORACLE_HOME/network/admin/sqlnet.ora,加两行:SQLNET.ALLOWED_LOGON_VERSION_SERVER=8SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8 - 重启监听(
lsnrctl reload或lsnrctl stop && lsnrctl start)——注意:部分环境要求重启实例才能生效 - 用
/ as sysdba登录,执行:ALTER USER scott IDENTIFIED BY scott123;(严禁用双引号!否则强制生成12C版本)
用户能登录但 SELECT/EXECUTE 报权限不足
常见于从 11g 迁移过来的普通用户,比如 GRANT CONNECT, RESOURCE TO scott; 看似给了基础权限,但在 19c 中 RESOURCE 不再隐含 UNLIMITED TABLESPACE,建表时直接报 ORA-01950: no privileges on tablespace 'USERS'。
- 显式补授权:
GRANT UNLIMITED TABLESPACE TO scott; - 检查 profile 是否限制了角色激活:
SELECT profile FROM dba_users WHERE username = 'SCOTT';
若为DEFAULT,确认该 profile 没禁用默认角色:SELECT resource_name, limit FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_name IN ('FAILED_LOGIN_ATTEMPTS', 'PASSWORD_LOCK_TIME'); - 19c 默认关闭了
CREATE DATABASE LINK权限,如需跨库访问,必须显式授予:GRANT CREATE DATABASE LINK TO scott;
DBA 用户无法登录或权限异常
升级后 SYS / SYSTEM 登录失败,往往是因为 PASSWORD_VERIFY_FUNCTION 被继承或残留。19c 的 ORA12C_STRONG_VERIFY_FUNCTION 会拒绝短密码、纯数字等,哪怕你设了 sec_case_sensitive_logon=false,它仍会在重置密码时强行校验。
- 查 profile 绑定:
SELECT profile, password_verify_function FROM dba_profiles WHERE profile = 'DEFAULT'; - 清空验证函数(关键一步):
ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION NULL; - 重置密码(仍禁用双引号):
ALTER USER system IDENTIFIED BY manager123; - 刷新共享池确保新密码生效:
ALTER SYSTEM FLUSH SHARED_POOL;
Pro*C 或旧客户端连上但执行报错
这类问题常被误判为权限问题,实际是预编译环境与 19c OCI 接口不兼容。例如 implicit declaration of function 'sqlcxt' 或运行时报 libclntsh.so: cannot open shared object file。
- 确保
LD_LIBRARY_PATH包含 19c client 的lib路径:export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH - Pro*C 编译时必须显式包含头文件:
在 .pc 文件开头加:EXEC SQL INCLUDE sqlca;EXEC SQL INCLUDE sqlcpr; - 生成的 .c 文件需手动补:
#include <sqlca.h></sqlca.h>#include <sqlcpr.h></sqlcpr.h>#include <oci.h></oci.h>
真正容易被忽略的是:密码重置必须在 SQLNET.ALLOWED_LOGON_VERSION_SERVER=8 生效后立刻执行,且不能带双引号;profile 的 PASSWORD_VERIFY_FUNCTION 清空操作不可跳过;UNLIMITED TABLESPACE 在 19c 中已不是默认权限。这三步漏掉任何一环,都会让“权限修复”变成无效操作。


















