必须重新执行utlpwdmg.sql并显式绑定到profile才生效;直接修改脚本内容无效,因Oracle只调用profile中PASSWORD_VERIFY_FUNCTION字段指定的函数,需先查用户profile及绑定函数,再以SYS AS SYSDBA执行脚本并ALTER PROFILE绑定。
直接改 utlpwdmg.sql 文件内容没用,必须重新执行脚本并绑定到 profile 才生效。
很多问题出在“以为改了就生效”,其实 profile 没更新。先查清楚谁在管密码校验:
SELECT profile FROM dba_users WHERE username = 'YOUR_USER';
SELECT limit FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_name = 'PASSWORD_VERIFY_FUNCTION';
NULL,说明没启用复杂度;如果是 verify_function_11G 或 ora12c_strong_verify_function,说明已启用但可能版本不匹配跳过任一检查,脚本会编译成功但函数不触发校验,或者直接报错。
SYS AS SYSDBA 连接,SYSTEM 或普通 DBA 权限不够RESOURCE_LIMIT 必须为 TRUE:运行 SHOW PARAMETER resource_limit,若为 FALSE,先执行 ALTER SYSTEM SET resource_limit = TRUE;
$ORACLE_HOME/rdbms/admin/utlpwdmg.sql,别用网上下载的同名文件覆盖原版常见需求是调低长度、去掉特殊字符要求,但改法不对等于关掉校验。
min_length(11g)、length(12c+)、min_uppercase/upper、min_lowercase/lower、min_digits/digit、min_special/special
raise_application_error 分支前的任意校验逻辑,否则函数可能提前返回 TRUE
DBMS_OUTPUT.PUT_LINE —— 登录鉴权阶段没有输出上下文,还可能因权限报 ORA-06502
只改脚本或只改函数定义,都不算完成。
@?/rdbms/admin/utlpwdmg.sql(注意是 @,不是 START)ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION ora12c_strong_verify_function;(12c+ 推荐)或 verify_function_11G(11g 兼容)ALTER USER test_user IDENTIFIED BY simple123;,看是否报 ORA-28003 及具体错误码最常被忽略的是 profile 绑定这一步——函数编译成功 ≠ 生效;还有人把 utlpwdmg.sql 改完后忘了重新执行,只改了源文件,数据库里还是旧函数。