ORACLE對象名大小寫敏感性相關的深入分析

來源:互聯網
上載者:User

註:
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在讀取資料字典時只要發現對像名裡有小寫字母或者是除字母漢字以外開頭的字元都認為是大小寫敏感的,並且要求在訪問時需要加上引號。

 

============================下面是自己做的一點小實驗===============================

 

SQL> create table "xiaoxie"<br /> 2 (<br /> 3 id number,<br /> 4 name varchar2(20)<br /> 5 )<br /> 6 ;</p><p>Table created.</p><p>SQL> select * from xiaoxie;<br />select * from xiaoxie<br /> *<br />ERROR at line 1:<br />ORA-00942: table or view does not exist</p><p>SQL> select * from "xiaoxie";</p><p>no rows selected</p><p>SQL> alter table "xiaoxie" add ("addr" varchar2(20));</p><p>Table altered.</p><p>SQL> desc "xiaoxie"<br /> Name Null? Type<br /> ----------------------------------------- -------- ----------------------------</p><p> ID NUMBER<br /> NAME VARCHAR2(20)<br /> addr VARCHAR2(20)</p><p>SQL> select addr from "xiaoxie";<br />select addr from "xiaoxie"<br /> *<br />ERROR at line 1:<br />ORA-00904: "ADDR": invalid identifier</p><p>SQL> select "addr" from "xiaoxie";</p><p>no rows selected<br />

 

==========================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以前的資料庫驗證。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.