首页 > 数据库 >Oracle 19c的参数sec_case_sensitive_logon与ORA-01017错误

Oracle 19c的参数sec_case_sensitive_logon与ORA-01017错误

时间:2023-04-26 10:46:02浏览次数:40  
标签:case USERNAME 01017 system Oracle sensitive SQL DATE

Oracle的参数sec_case_sensitive_logon是Oracle 11g开始被引入。这个参数主要是为了控制密码的大小写敏感问题。
sec_case_sensitive_logon=true表示密码区分大小写。
sec_case_sensitive_logon=false表示密码不区分大小写。
从Oracle 12c开始,参数sec_case_sensitive_logon被弃用了。但是为了向下兼容,即使在Oracle 19c中,这个参数依然保留了。这个参数在Oracle 12c(确切的说是12.2以及后续版本)和19c中不能设置为false,因为它和SQLNET.ALLOWED_LOGON_VERSION_SERVER=12或者SQLNET.ALLOWED_LOGON_VERSION_SERVER=12a不兼容。这是因为用于此模式的更安全的密码版本仅支持区分大小写的密码检查。简单点来说,就是这种环境下,这种设置会冲突。官方文档[1]的阐述如下所示:

Note the following implications of setting the value to 12 or 12a:
• A value of FALSE for the SEC_CASE_SENSITIVE_LOGON Oracle instance initialization parameter must not be used because password case insensitivity requires the use of the 10G password version. If the SEC_CASE_SENSITIVE_LOGON Oracle instance initialization parameter is set to FALSE, then user accounts and secure roles become unusable because Exclusive Mode excludes the use of the 10G password version. The SEC_CASE_SENSITIVE_LOGON Oracle instance initialization parameter enables or disables password case sensitivity. However, since Exclusive mode is enabled by default in this release, disabling the password case sensitivity is not supported.
Note:
• The use of the Oracle instance initialization parameter SEC_CASE_SENSITIVE_LOGON is deprecated in favor of setting the SQLNET.ALLOWED_LOGON_VERSION_SERVER parameter to 12 to ensure that passwords are treated in a case-sensitive fashion.
• Disabling password case sensitivity is not supported in Exclusive mode (when SQLNET.ALLOWED_LOGON_VERSION_SERVER is set to 12 or 12a.)
• Releases of OCI clients earlier than Oracle Database 10g cannot authenticate to the Oracle database using password-based authentication.
• If the client uses Oracle Database 10g, then the client will receive an ORA-03134: Connections to this server version are no longer supported error message. To allow the connection, set the SQLNET.ALLOWED_LOGON_VERSION_SERVER value to 8. Ensure the DBA_USERS.PASSWORD_VERSIONS value for the account contains the value 10G. It may be necessary to reset the password for that account.

下面我们来构造一个例子,看看这个参数sec_case_sensitive_logon的影响


SQL> select banner_full from v$version;

BANNER_FULL
----------------------------------------------------------------------------------------------------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0


1 row selected.

SQL> show parameter sec_case_sensitive_logon;

NAME                                 TYPE        VALUE
-------------------------- ----------- ------------------------------
sec_case_sensitive_logon        boolean     TRUE
SQL> alter user system identified by "system#1245";

User altered.
SQL> SET LINESIZE 1080;
SQL> SET PAGESIZE 36;
SQL> COL USERNAME FOR A24;
SQL> COL ACCOUNT_STATUS FOR A16; 
SQL> COL DEFAULT_TABLESPACE FOR A16;
SQL> COL TEMPORARY_TABLESPACE FOR A10;
SQL> COL PROFILE FOR A10;
SQL> COL LOCK_DATE FOR A20;
SQL> COL EXPIRY_DATE FOR A20;
SQL> COL PASSWORD_VERSIONS FOR A12;
SQL> SELECT USERNAME 
  2       , ACCOUNT_STATUS
  3       , DEFAULT_TABLESPACE
  4       , TEMPORARY_TABLESPACE
  5       , PROFILE
  6       , TO_CHAR(LOCK_DATE,'YYYY-MM-DD HH24:MI:SS')    AS LOCK_DATE
  7       , TO_CHAR(EXPIRY_DATE,'YYYY-MM-DD HH24:MI:SS')  AS EXPIRY_DATE 
  8      , PASSWORD_VERSIONS
  9  FROM DBA_USERS 
 10  WHERE USERNAME=UPPER('&USERNAME')
 11  ORDER BY EXPIRY_DATE;
Enter value for username: system
old  10: WHERE USERNAME=UPPER('&USERNAME')
new  10: WHERE USERNAME=UPPER('system')

USERNAME      ACCOUNT_STATUS   DEFAULT_TABLESPA TEMPORARY_ PROFILE    LOCK_DATE           EXPIRY_DATE          PASSWORD_VER
---------- ---------------- ---------------- ---------- ---------- --------------- -------------------- ------------
SYSTEM             OPEN             SYSTEM           TEMP       DEFAULT                        2023-10-22 17:25:09    11G 12C

SQL> alter system set sec_case_sensitive_logon=false scope=both;

System altered.

SQL>

然后我们在另外一个窗口使用system账号登陆数据库


$ sqlplus system/system#1245

SQL*Plus: Release 19.0.0.0.0 - Production on Tue Apr 25 17:16:28 2023
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

ERROR:
ORA-01017: invalid username/password; logon denied

如果我们将参数设置sec_case_sensitive_logon为true(这个参数调整后可以立即生效,不用重启),


SQL> show user;
USER is "SYS"
SQL> alter system set sec_case_sensitive_logon=true scope=both;

System altered.

SQL>

然后验证如下所示所示,一切正常,所以如果你遇到ORA-01017这个错误,而且数据库版本为12c/19c,如果你确认你密码是正确的,那么检查一下这个参数。


$sqlplus system/system#1245

SQL*Plus: Release 19.0.0.0.0 - Production on Tue Apr 25 17:20:28 2023
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

Last Successful login time: Tue Apr 25 2023 09:54:37 +08:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL>

下面我们再来测试一下,在参数sec_case_sensitive_logon为false的情况,我们控制密码版本来解决ORA-01017这个错误


SQL> show user;  
USER is "SYS"
SQL> show parameter sec_case_sensitive_logon;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sec_case_sensitive_logon             boolean     FALSE
SQL>

修改sqlnet.ora这个参数文件,设置下面参数:

SQLNET.ALLOWED_LOGON_VERSION_CLIENT = 10
SQLNET.ALLOWED_LOGON_VERSION_SERVER = 10

修改sqlnet.ora参数文件后,必须重新登陆SQLPlus后(如果使用之前的SQLPlus连接也不会生效),执行下面脚本


SQL> alter user system identified by "system#1245";

User altered.

SQL> SET LINESIZE 1080;
SQL> SET PAGESIZE 36;
SQL> COL USERNAME FOR A16;
SQL> COL ACCOUNT_STATUS FOR A16; 
SQL> COL DEFAULT_TABLESPACE FOR A16;
SQL> COL TEMPORARY_TABLESPACE FOR A10;
SQL> COL PROFILE FOR A10;
SQL> COL LOCK_DATE FOR A20;
SQL> COL EXPIRY_DATE FOR A20;
SQL> COL PASSWORD_VERSIONS FOR A12;
SQL> SELECT USERNAME 
  2       , ACCOUNT_STATUS
  3       , DEFAULT_TABLESPACE
  4       , TEMPORARY_TABLESPACE
  5       , PROFILE
  6       , TO_CHAR(LOCK_DATE,'YYYY-MM-DD HH24:MI:SS')    AS LOCK_DATE
  7       , TO_CHAR(EXPIRY_DATE,'YYYY-MM-DD HH24:MI:SS')  AS EXPIRY_DATE 
  8      , PASSWORD_VERSIONS
  9  FROM DBA_USERS 
 10  WHERE USERNAME=UPPER('&USERNAME')
 11  ORDER BY EXPIRY_DATE;
Enter value for username: system
old  10: WHERE USERNAME=UPPER('&USERNAME')
new  10: WHERE USERNAME=UPPER('system')

USERNAME         ACCOUNT_STATUS   DEFAULT_TABLESPA TEMPORARY_ PROFILE    LOCK_DATE            EXPIRY_DATE          PASSWORD_VER
---------------- ---------------- ---------------- ---------- ---------- -------------------- -------------------- ------------
SYSTEM           OPEN             SYSTEM           TEMP       DEFAULT                         2023-10-23 09:21:27  10G 11G 12C

1 row selected.

SQL>

此时验证system账号登陆,则不会报ORA-01017这个错误了。


$ sqlplus system/system#1245

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Apr 26 09:22:18 2023
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

Last Successful login time: Tue Apr 25 2023 17:20:29 +08:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL>

注意:最好使用其他账号验证测试,这里仅仅是为了偷懒,使用测试环境的system账号测试验证。更多相关信息也可以参考The new Exclusive Mode default for password-based authentication in Oracle 12.2 conflicts with case-insensitive password configurations. All user login fails with ORA-1017 after upgrade to 12.2 (Doc ID 2075401.1)[2]

参考资料

[1]

官方文档1: https://docs.oracle.com/en/database/oracle/oracle-database/19/netrf/parameters-for-the-sqlnet.ora.html#GUID-1FA9D26C-4D97-4D1C-AB47-1EC234D924AA

[2]

Doc ID 2075401.1: https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=249715360691380&id=2075401.1&_afrWindowMode=0&_adf.ctrl-state=1agoeyy4f0_80

标签:case,USERNAME,01017,system,Oracle,sensitive,SQL,DATE
From: https://www.cnblogs.com/kerrycode/p/17354780.html

相关文章

  • Case
    基础抢红包Solution1:找素数......
  • JavaScript的swichcase方法
    functionchangeBody(index){switch(index){case1:{document.getElementById('bull').style.display="";document.getElementById('cont').style.display="none";document.getElementById('gridPager'......
  • 关于项目组件打包时遇到 `Uncaught TypeError: Cannot read property 'toLowerCase' o
    在全局注册组件时采用遍历组件池的方法时 每个组件都应该具备name属性 否则会出现UncaughtTypeError:Cannotreadproperty'toLowerCase'ofundefined  ......
  • Oracle CASE WHEN 用法介绍
    1.CASEWHEN表达式有两种形式 --简单Case函数CASEsexWHEN'1'THEN'男'WHEN'2'THEN'女'ELSE'其他'END--Case搜索函数CASEWHENsex='1'THEN'男'WHENsex='2'THEN'女&......
  • 报错解决:user.Case: (models.E020) The 'Case.check()' class method is currently ov
    Django在启动时报错,如下:user.Case:(models.E020)The'Case.check()'classmethodiscurrentlyoverriddenby<django.db.models.query_utils.DeferredAttributeobjectat0x0000020331E0AE20>.意思是说:在user.Case.check()在执行的过程中被【django.db.models.query_ut......
  • Shell脚本--case in
    当分支较多,并且判断条件比较简单时,使用casein语句就比较方便了。其基本格式为:caseexpressioninpattern1)statement1;;pattern2)statement2;;pattern3)statement3;;……*)statem......
  • switch case语法
    switch(表达式)中表达式的值必须是一下六中类型:byteshortcharint枚举Stringswitchcase中case情况都一样的可以考虑合并switch(表达式){ case常量1: 语句1; break; case常量2: 语句2; break; ... default: break;}......
  • 6.case语句之场景示例:Rsync启动脚本
    1.编写一个rsync的启动停止脚本   实现:startstopstatusrestart   1.如何启动rsync        /usr/bin/rsync--daemon   2.如何停止rsync    pkillrsync #注意:千万不要使用rsync作为脚本的名字   3.参考系统中其他的服务的......
  • Django笔记二十三之case、when操作条件表达式搜索、更新等操作
    本文首发于公众号:Hunter后端原文链接:Django笔记二十三之条件表达式搜索、更新等操作这一篇笔记将介绍条件表达式,就是如何在model的使用中根据不同的条件筛选数据返回。这个操作类似于数据库中ifelifelse的逻辑。以下是本篇笔记的目录:model和数据准备When和Case......
  • oracle中case when 和 decode的区别
    1、decode简洁、casewhen复杂(但能实现的功能更多)2、返回值类型,casewhen的返回值类型必须一致如:SELECTCASEWHEN1=1THEN1ELSE'0'ENDFROMDUAL;--这样会报错:ORA-00932:数据类型不一致:应为NUMBER,但却获得CHAR   而decode的返回值类型需跟第一个返回值的类型一......