在之前的博客讲用户管理时提到创建用户的问题:
DM 达梦数据库 用户管理 说明
https://www.cndba.cn/dave/article/3567
在对用户密码进行修改时,会有如下提示:
SQL> alter user dmhr identified by dmhr;
alter user dmhr identified by dmhr;
[-2504]:Error in line: 1
Password length must between 9 and 48.
used time: 0.992(ms). Execute id is 0.
SQL> alter user dmhr identified by "www.cndba.cn";
executed successfully
used time: 5.587(ms). Execute id is 74.
这里的限制就是DM的口令策略,该策略由dm.ini 文件中的PWD_POLICY 参数控制,该参数时动态/系统级。可以在线进行修改。 该策略有如下之:
0: 无策略;
1: 禁止与用户名相同;
2: 口令长度不小于 9;
4: 至少包含一个大写字母(A-Z);
8 :至少包含一个数字(0-9);
16:至少包含一个标点符号,英文输入法状态下,除“和空格外的所有符号;
若为其他数字,则表示配置值的和,如 3=1+2, 表示同时启用第 1 项和第 2 项策略。
当COMPATIBLE_MODE=1 时,PWD_POLICY 的实际值均为 0。
查看当前值:
SQL> select SF_GET_PARA_VALUE(2,'PWD_POLICY');
LINEID SF_GET_PARA_VALUE(2,'PWD_POLICY')
---------- ---------------------------------
1 2
used time: 1.083(ms). Execute id is 88.
设置为1:
SQL> SP_SET_PARA_VALUE (2,'PWD_POLICY',1);
DMSQL executed successfully
used time: 16.115(ms). Execute id is 89.
SQL> select SF_GET_PARA_VALUE(2,'PWD_POLICY');
LINEID SF_GET_PARA_VALUE(2,'PWD_POLICY')
---------- ---------------------------------
1 2
used time: 0.725(ms). Execute id is 90.
SQL> SP_SET_PARA_VALUE (1,'PWD_POLICY',1);
DMSQL executed successfully
used time: 10.499(ms). Execute id is 91.
参数生效:
SQL> select SF_GET_PARA_VALUE(2,'PWD_POLICY');
LINEID SF_GET_PARA_VALUE(2,'PWD_POLICY')
---------- ---------------------------------
1 1
used time: 1.507(ms). Execute id is 92.
SQL>
SQL> select SF_GET_PARA_VALUE(1,'PWD_POLICY');
LINEID SF_GET_PARA_VALUE(1,'PWD_POLICY')
---------- ---------------------------------
1 1
used time: 11.064(ms). Execute id is 94.
SQL>
修改密码验证:
SQL> alter user dmhr identified by dmhr;
alter user dmhr identified by dmhr;
[-2504]:Error in line: 1
Password length must between 9 and 48.
used time: 1.159(ms). Execute id is 0.
查询参数时生效了,但从实际测试看并未生效,重启DB在测试,依旧没有生效:
[dave@www.cndba.cn cndba]$ service DmServicedave stop
Stopping DmServicedave: [ OK ]
[dave@www.cndba.cn cndba]$ service DmServicedave start
Starting DmServicedave: [ OK ]
[dave@www.cndba.cn cndba]$
SQL> alter user dmhr identified by dmhr;
Server[LOCALHOST:5236]:mode is normal, state is open
connected
alter user dmhr identified by dmhr;
[-2504]:Error in line: 1
Password length must between 9 and 48.
used time: 1.457(ms). Execute id is 0.
SQL>
SQL> select SF_GET_PARA_VALUE(1,'PWD_POLICY');
LINEID SF_GET_PARA_VALUE(1,'PWD_POLICY')
---------- ---------------------------------
1 1
used time: 9.774(ms). Execute id is 3.
SQL> select SF_GET_PARA_VALUE(2,'PWD_POLICY');
LINEID SF_GET_PARA_VALUE(2,'PWD_POLICY')
---------- ---------------------------------
1 1
used time: 1.414(ms). Execute id is 4.
SQL>
新建用户测试生效:即默认的策略时对新用户生效,对老用户无效:
SQL> create user anqing identified by dave;
executed successfully
used time: 14.264(ms). Execute id is 10.
SQL>
SQL> alter user anqing identified by anqing;
executed successfully
used time: 5.940(ms). Execute id is 11.
SQL>
进一步研究,发现用户的密码时有版本的:对应版本为0的时可以修改的,这里的0 对应的就是我们的口令策略,所以如果对于老用户,如果想修改,只需要将用户的策略修改成对应的口令策略即可:
SQL> select username,password_versions from dba_users;
LINEID USERNAME PASSWORD_VERSIONS
---------- ---------- -----------------
1 SYS 0
2 SYSDBA 0
3 SYSAUDITOR 0
4 SYSSSO 0
5 DMHR 2
6 DAVE 2
7 CNDBA 2
8 DEXP 2
9 DIMP 2
10 ANQING 0
10 rows got
used time: 8.127(ms). Execute id is 24.
SQL>
SQL> select t2.id,t1.username,t2.pwd_policy from dba_users t1,sysuser$ t2 where t1.user_id=t2.id;
LINEID ID USERNAME PWD_POLICY
---------- ----------- ---------- -----------
1 50331648 SYS 0
2 50331649 SYSDBA 0
3 50331650 SYSAUDITOR 0
4 50331651 SYSSSO 0
5 50331748 DMHR 2
6 50331749 DAVE 2
7 50331750 CNDBA 2
8 50331751 DEXP 2
9 50331752 DIMP 2
10 50331753 ANQING 0
10 rows got
used time: 14.906(ms). Execute id is 49.
SQL>
修改dmhr的口令策略为0:
SQL> alter user dmhr PASSWORD_POLICY 0;
alter user dmhr PASSWORD_POLICY 0;
[-5630]:Error in line: 1
Current DM Server is not a secure version, you can't do this operation.
used time: 0.884(ms). Execute id is 0.
SQL>
SQL> update sysuser$ set pwd_policy=0 where id=50331748;
update sysuser$ set pwd_policy=0 where id=50331748;
[-2633]:Error in line: 1
Try to alter system table or inner table[SYSUSER$].
used time: 1.093(ms). Execute id is 0.
SQL>
因为用的是企业版,所有无法修改,如果是安全版的DM,那么也可以直接修改老用户的策略版本,使用新策略。
结论:
每个用户在新建的时候,属性里的默认口令策略采用系统的口令策略,我们之后修改的口令策略只对之后的用户生效。对老用户,在安全版的DM中可以直接修改每个用户的口令策略,使之使用新的口令策略。
版权声明:本文为博主原创文章,未经博主允许不得转载。



