達夢屏蔽關鍵字
在創建表或者其他數據庫對象的時候可能會報出"語法分析錯誤",這種情況可能是由於創建對象的名稱使用了數據庫系統所保留的關鍵字,針對這種情況達夢提供了兩種解決方法來屏蔽關鍵字。
1、修改數據庫dm.ini中的參數EXCLUDE_RESERVED_WORDS
2、配置客戶端dm_svc.conf文件,添加KEYWORDS配置項(推薦)
一、修改dm.ini
參數介紹
EXCLUED_RESERVED_WORDS
該參數為靜態參數,默認為空,值為需要去除的保留字列表,保留字之間以逗號分隔開。
V$RESERVED_WORDS
保留字統計表,記錄保留字的分類信息。RES_FIXED=N 的關鍵字,通過 ini 參數 EXCLUDE_RESERVED_WORDS 設置之后會失效,此視圖不會再記錄。
序號 |
列名 |
數據類型 |
說明 |
1 |
KEYWORD |
VARCHAR(30) |
關鍵字名字 |
2 |
LENGTH |
INTEGER |
關鍵字長度 |
3 |
RESERVED |
VARCHAR(1) |
是否是保留字 |
4 |
RES_SQL |
VARCHAR(1) |
是否是 SQL 保留字,不能作 SQL 中的標識符 |
5 |
RES_PL |
VARCHAR(1) |
是否是 DMSQL 程序保留字,不能作 DMSQL 程序語句塊中的標識符 |
6 |
RES_SCHEMA |
VARCHAR(1) |
是否是模式保留字,不能作模式標識符 |
7 |
RES_VARIABLE |
VARCHAR(1) |
是否是變量保留字,不能作變量標識符 |
8 |
RES_ALIAS |
VARCHAR(1) |
是否是別名保留字,不能作別名標識符 |
9 |
RES_FIXED |
VARCHAR(1) |
關鍵字是否可以 EXCLUDE,Y 不可以,N 可以 |
V$RESERVED_WORDS視圖中RES_ERVED=Y的關鍵字為系統保留字,無法直接在SQL語句中使用。RES_FIXED=Y的保留字是不能屏蔽的,屏蔽會影響使用。
測試
1、創建兩張包含關鍵字的表
CREATE TABLE TEST_KEY(SELECT VARCHAR(10));
CREATE TABLE TEST_KEY2(SCHEMA VARCHAR(10));
可以看到都出錯了。
2、修改dm.ini
修改dm.ini中的EXCLUDE_RESERVED_WORDS =SCHEMA,SELECT
因為是靜態參數所以要重啟數據庫生效。
3、再次創建
可以看到如果是RES_FIXED=Y的那么即使修改了EXCLUDE_RESERVED_WORDS也創建不了,只對RES_FIXED=N的保留字可以屏蔽。
二、配置dm_svc.conf
第二種方法通過配置dm_svc.conf文件,添加key_words配置項
# 全局配置區
TIME_ZONE=(480)
LANGUAGE=(cn)
DB=(192.168.138.1:5236)
[DB]
# 服務配置區
KEYWORDS=(SELECT,SCHEMA)
32 位的 DM 安裝在 Win32 操作平台下,此文件位於%SystemRoot%\system32
64 位的 DM 安裝在 Win64 操作平台下,此文件位於%SystemRoot%\system32
32 位的 DM 安裝在 Win64 操作平台下,此文件位於%SystemRoot%\SysWOW64
在 Linux 平台下,此文件位於/etc 目錄。
1、開始創建表
可以看到這次即使有是RES_FIXED=Y的關鍵字也可以創建成功!
2、問題
雖然有是RES_FIXED=Y關鍵字的表也可以創建成功,但是在使用sql的時候會出現問題!
select * from test_key;
但是這個只影響通過dm_svc.conf連接的會話,如果使用的ip是不會影響的,但是此時也不能創建含有關鍵字的表。
除了查詢sql受影響室外,我這個版本的管理工具在打開的時候也報了錯誤!
總結
(1)在實際開發中,對於有使用到系統關鍵字保留字的所有SQL語句和對象名稱,最優選是修改SQL語句和對象名稱;
(2)對於必須需要數據庫進行屏蔽的關鍵字,建議使用dm_svc.conf文件進行屏蔽,盡量減少影響;
(3)RES_FIXED=Y的保留字是不能屏蔽的,屏蔽之后會影響使用;
(4)如果對象名稱加上雙引號,即使對象名稱是未屏蔽的保留字,對象也可以創建成功。但是在該對象名稱上使用SQL語句時,也需要給對象名稱加上雙引號。