Common User密码策略由CDB$ROOT的dba_profiles控制,需切至CDB$ROOT查询cdb_users确认profile及expiry_date;过期用户须用IDENTIFIED BY VALUES恢复哈希值;修改DEFAULT profile可禁用过期机制,但不更新已有expiry_date。

查清CDB$ROOT下COMMON USER的PROFILE和过期状态
Common User(如C##FLINK、C##ADMIN)的密码策略由CDB$ROOT中的dba_profiles控制,不是PDB里的。直接在PDB里查dba_profiles或改DEFAULT profile完全无效。必须先切到CDB$ROOT:ALTER SESSION SET CONTAINER = CDB$ROOT;,再确认用户绑定的profile:SELECT username, profile, account_status, expiry_date FROM cdb_users WHERE username = 'C##FLINK' AND con_id = 1;。注意con_id = 1才是CDB$ROOT;若account_status为EXPIRED或EXPIRED(GRACE),且expiry_date早于SYSDATE,说明已过期——此时改profile也救不回来,得重置密码。
修改CDB$ROOT的DEFAULT profile禁用过期机制
绝大多数Common User没显式指定profile,走的是CDB$ROOT下的DEFAULT profile。要一劳永逸,就改它:ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED PASSWORD_GRACE_TIME 0;。设PASSWORD_GRACE_TIME 0很关键:避免宽限期导致应用反复用旧密码连接失败、占满连接数(曾有案例因GRACE状态用户持续重连,触发ORA-00020)。执行后立即生效,但**不会自动更新已有用户的expiry_date字段**——已过期的用户仍需单独处理。
已过期的COMMON USER必须用IDENTIFIED BY VALUES恢复
如果用户已过期,仅改profile毫无作用。不能用ALTER USER ... IDENTIFIED BY,因为一旦目标profile启用了PASSWORD_VERIFY_FUNCTION(如ORA12C_VERIFY_FUNCTION),就会强制校验新密码复杂度,而你可能根本不知道原密码。正确做法是提取原哈希值:SELECT name, spare4 FROM sys.user$ WHERE name = 'C##FLINK';,然后执行:ALTER USER c##flink IDENTIFIED BY VALUES 'S:...';。注意S:前缀不能丢,这是19c SHA-2哈希标识;若漏掉或误用11g风格的PASSWORD字段值,会报ORA-01017。
多租户下COMMON USER密码策略不可继承PDB配置
Common User的密码行为完全由CDB$ROOT的profile决定,PDB中任何profile修改(包括PASSWORD_ROLLOVER_TIME)对其无效。有人试图在PDB里建c##开头的profile来覆盖,结果触发ORA-65140: invalid common profile name——CDB中创建common profile必须带c##前缀,且只能在CDB$ROOT执行。另外,PASSWORD_ROLLOVER_TIME特性在19c中虽支持,但**不适用于Common User**,官方文档明确建议仅用于本地用户。所以别在CDB$ROOT里给common user配rollover,纯属白忙。











