达梦屏蔽关键字

在创建表或者其他数据库对象的时候可能会报出"语法分析错误",这种情况可能是由于创建对象的名称使用了数据库系统所保留的关键字,针对这种情况达梦提供了两种解决方法来屏蔽关键字。

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));

达梦屏蔽关键字_对象名

 

 

达梦屏蔽关键字_对象名_02

 

可以看到都出错了。

2、修改dm.ini

修改dm.ini中的EXCLUDE_RESERVED_WORDS =SCHEMA,SELECT

因为是静态参数所以要重启数据库生效。

3、再次创建

达梦屏蔽关键字_sql_03

 

达梦屏蔽关键字_对象名_04

 

可以看到如果是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;

达梦屏蔽关键字_标识符_05

 

但是这个只影响通过dm_svc.conf连接的会话,如果使用的ip是不会影响的,但是此时也不能创建含有关键字的表。

达梦屏蔽关键字_达梦_06

 

达梦屏蔽关键字_保留字_07

 

除了查询sql受影响室外,我这个版本的管理工具在打开的时候也报了错误!

达梦屏蔽关键字_标识符_08

 

总结

(1)在实际开发中,对于有使用到系统关键字保留字的所有SQL语句和对象名称,最优选是修改SQL语句和对象名称;

(2)对于必须需要数据库进行屏蔽的关键字,建议使用dm_svc.conf文件进行屏蔽,尽量减少影响;

(3)RES_FIXED=Y的保留字是不能屏蔽的,屏蔽之后会影响使用;

(4)如果对象名称加上双引号,即使对象名称是未屏蔽的保留字,对象也可以创建成功。但是在该对象名称上使用SQL语句时,也需要给对象名称加上双引号。