ORACLE对象名大小写敏感性相关的深入分析

来源:百度文库 编辑:神马文学网 时间:2024/07/01 13:33:05
注:
1、 本文是以ORACLE9.2为测试分析版本
2、 本文中提到的ORACLE对像名包括ORACLE中的表名、视图名、字段名、函数名等等。
以下是笔者对创建表及访问使用不同命名方式的一个实例,是笔者的机器上测试结果: Connected to Oracle9i Enterprise Edition Release 9.2.0.7.0
Connected as ***** SQL> create table mytable1
2 (
3    C1 VARCHAR2(6)
4 );
Table created
SQL> select * from "MYTABLE1";
C1
------
SQL> select * from MYtable1;
C1
------
SQL> select * from "mytable1";
select * from "mytable1"
ORA-00942: 表或视图不存在
SQL> drop table mytable1;
Table dropped
SQL>
SQL>
SQL> create table "mytable1"
2 (
3    C1 VARCHAR2(6)
4 );
Table created
SQL> select * from "mytable1";
C1
------
SQL> select * from mytable1;
select * from mytable1
ORA-00942: 表或视图不存在
SQL> select * from MYTABLE1;
select * from MYTABLE1
ORA-00942: 表或视图不存在
下表为笔者的测试结果汇总:
√表示允许访问,×表示不允许访问。
实例:
读取
创建 mytable1 MYTABLE1 “mytable1” “MYTABLE1”
mytable1 √ √ × √
MYTABLE1 √ √ × √
“mytable1” × × √ ×
“MYTABLE1” √ √ × √ 总结归纳:
读取
创建 小写字母 大写字母 加引号小写字母 加引号大写字母
小写字母 √ √ × √
大写字母 √ √ × √
加引号小写字母 × × √ ×
加引号大写字母 √ √ × √  以下为根据笔者对ORACLE数据字典及实际测试总结分析结论:
ORACLE在创建对像时如果没有加引号,对存入数据字典时都会将对像名小写字母转换成大写字母存储,如mytable将转换成MYTABLE;如果创建时加了引号,则以引号内的实际字符存储。
访问时如果没加引号则会将小写字母转换成大写字母再访问,如mytable将转换成MYTABLE;如果加了引号则以引号内的实际字符访问。
ORACLE在读取数据字典时只要发现对像名里有小写字母或者是除字母汉字以外开头的字符都认为是大小写敏感的,并且要求在访问时需要加上引号。============================下面是自己做的一点小实验===============================view plaincopy to clipboardprint?
SQL> create table "xiaoxie" 
  2  (  
  3  id number,  
  4  name varchar2(20)  
  5  )  
  6  ;  
 
Table created.  
 
SQL> select * from xiaoxie;  
select * from xiaoxie  
              *  
ERROR at line 1:  
ORA-00942: table or view does not exist  
 
 
SQL> select * from "xiaoxie";  
 
no rows selected  
 
SQL> alter table "xiaoxie" add ("addr" varchar2(20));  
 
Table altered.  
 
SQL> desc "xiaoxie" 
 Name                                      Null?    Type  
 ----------------------------------------- -------- ----------------------------  
 
 ID                                                 NUMBER  
 NAME                                               VARCHAR2(20)  
 addr                                               VARCHAR2(20)  
 
SQL> select addr from "xiaoxie";  
select addr from "xiaoxie" 
       *  
ERROR at line 1:  
ORA-00904: "ADDR": invalid identifier  
 
 
SQL> select "addr" from "xiaoxie";  
 
no rows selected 
SQL> create table "xiaoxie"
  2  (
  3  id number,
  4  name varchar2(20)
  5  )
  6  ;Table created.SQL> select * from xiaoxie;
select * from xiaoxie
              *
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> select * from "xiaoxie";no rows selectedSQL> alter table "xiaoxie" add ("addr" varchar2(20));Table altered.SQL> desc "xiaoxie"
 Name                                      Null?    Type
 ----------------------------------------- -------- ---------------------------- ID                                                 NUMBER
 NAME                                               VARCHAR2(20)
 addr                                               VARCHAR2(20)SQL> select addr from "xiaoxie";
select addr from "xiaoxie"
       *
ERROR at line 1:
ORA-00904: "ADDR": invalid identifier
SQL> select "addr" from "xiaoxie";no rows selected
 ==========================ORACLE 11G新特性--密码大小写敏感===========================密码大小写敏感是 11g数据库默认的一个新特性,数据库配置助手(DBCA)在创建数据库期间允许你将这个设置返回到11g以前的功能。  SEC_CASE_SENSITIVE_LOGON初始化参数控制密码大小写是否敏感,如果现有应用程序与11g的认证过程冲突,你可以使用ALTER SYSTEM命令将这一功能关闭。        SQL> SHOW PARAMETER SEC_CASE_SENSITIVE_LOGON
  NAME TYPE VALUE
  ------------------------------------ ----------- ------------------------------
  sec_case_sensitive_logon boolean TRUE
  SQL>
  SQL> ALTER SYSTEM SET SEC_CASE_SENSITIVE_LOGON = FALSE;
  System altered.
  SQL>
 下面的代码说明了密码大小写敏感的功能,首先,将SEC_CASE_SENSITIVE_LOGON初始化参数设置为TRUE,然后创建一个新用户,其密码包含大小写字母。         CONN / AS SYSDBA
  ALTER SYSTEM SET SEC_CASE_SENSITIVE_LOGON = TRUE;
  CREATE USER test2 IDENTIFIED BY Test2;
  GRANT CONNECT TO test2;
 使用新创建的用户正确的连接字符和大小写错误的密码进行连接尝试,会看到大小写敏感功能起作用了。   (www.Syue.com)       SQL> CONN test2/Test2
  Connected.
  SQL> CONN test2/test2
  ERROR:
  ORA-01017: invalid username/password; logon denied
  Warning: You are no longer connected to ORACLE.
  SQL>
将SEC_CASE_SENSITIVE_LOGON初始化参数设置为FALSE后就不区分密码大小写了。         CONN / AS SYSDBA
  ALTER SYSTEM SET SEC_CASE_SENSITIVE_LOGON = FALSE;
  SQL> CONN test2/Test2
  Connected.
  SQL> CONN test2/test2
  Connected.
  SQL>
 需要记住的是,即使大小写敏感密码参数没有启用,在保存密码时也是区分了大小写的,以便以后在启用大小写敏感参数时有效,下面的代码先禁用了大小写敏感密码,然后创建了一个包含大小写字符密码的用户。   www.Syue.com       CONN / AS SYSDBA
  ALTER SYSTEM SET SEC_CASE_SENSITIVE_LOGON = FALSE;
  CREATE USER test3 IDENTIFIED BY Test3;
  GRANT CONNECT TO test3;
[来源"岁月联盟"] 正如你预料之中的那样,登陆时不用考虑密码的大小写。  如果我们启用了大小写敏感参数,认证过程就会立即启用大小写验证。        CONN / AS SYSDBA
  ALTER SYSTEM SET SEC_CASE_SENSITIVE_LOGON = TRUE;
  SQL> CONN test3/Test3
  Connected.
  SQL> CONN test3/test3
  ERROR:
  ORA-01017: invalid username/password; logon denied
  Warning: You are no longer connected to ORACLE.
  SQL>
DBA_USERS视图包括了一列PASSWORD_VERSIONS,它表示密码是由哪个数据库版本创建的或最后修改的。       SQL> SELECT username, password_versions FROM dba_users;
  USERNAME PASSWORD
  ------------------------------ --------
  TEST 10G 11G
  SPATIAL_WFS_ADMIN_USR 10G 11G
  SPATIAL_CSW_ADMIN_USR 10G 11G
  APEX_PUBLIC_USER 10G 11G
  .
  .
  .
  SYSTEM 10G 11G
  SYS 10G 11G 
用户如果是从 10g导入的,那么PASSWORD_VERSIONS的值就是“10G”,维护区分大小写的密码不依赖于SEC_CASE_SENSITIVE_LOGON参数设置。假设SEC_CASE_SENSITIVE_LOGON参数被设置为TRUE,密码立即变为大小写敏感。orapwd工具的ignorecase参数允许你控制在密码文件中的密码是否大小写敏感,它的默认值是“n”,即默认大小写敏感。如果特权用户(SYSDBA和SYSOPER)是从之前的数据库版本中导入的,它们的密码也会包括在密码文件中,这些用户将会保留大小写敏感的密码,直到密码被修改。  要在密码文件中创建大小写敏感的密码,使用ingnorecase=y选项重新创建密码文件即可。 信息来源"岁月联盟" $ orapwd file=orapwDB11Gb entries=100 ignorecase=y password=mypassword  数据库连接的密码也是大小写敏感的,下面列出了在不同数据库版本之间连接时需要注意的问题。 11g连接到11g:创建数据库连接时,密码必须与远程数据库用户的密码大小写一致。
11g连接到11g以前的数据库:创建数据流连接时用的密码大小写随意,因为远程数据库会忽略大小写的。
11g以前的数据库连接到11g:必须将远程用户的密码全部修改为大写,只有这样才能通过11g以前的数据库验证。