暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

达梦数据库屏蔽系统保留字的方法

原创 LeeWen2020 2021-06-21
3284

前言

​ 当在达梦数据库中创建表等对象时,对象名称使用一些单词时可能会遇到创建失败报错“语法分析错误”,这种情况有可能是遇到了使用的对象名为系统保留字的无法使用。针对这种情况,一般建议修改对象名为系统保留字之外的名称。如果是现有的系统上,一定要使用系统保留字,那么对于部分系统保留字(非所有)可以通过参数屏蔽的方式来处理。
​ 达梦数据库中排除屏蔽系统保留字的方法有两种:
​ 第一种:修改数据库dm.ini中参数EXCLUDE_RESERVED_WORDS
​ 第二种:配置客户端dm_svc.conf文件,添加KEYWORDS配置项(推荐)

参数介绍

1、数据库配置文件dm.ini中EXCLUDE_RESERVED_WORDS参数

EXCLUDE_RESERVED_WORDS:语法解析时,需要去除的保留字列表,保留字之间以逗号分隔。默认为空,静态参数。

V$RESERVED_WORDS视图中RES_FIXED=N的关键字通过EXCLUDE_RESERVED_WORDS参数设置之后将会失效,V$RESERVED_WORDS视图不会再记录。

2、dm_svc.conf配置文件中KEYWORDS配置项

KEYWORDS:标识用户关键字,所有在列表中的字符串,如果以单词的形式出现在SQL语句中,则这个单词会被加上双引号。该配置项主要用来解决用户需要使用DM8中的保留字作为对象名使用的状况。

使用时需要注意,在dm_svc.conf文件中配置KEYWORDS时,KEYWORDS应配置在"服务配置区"中,不应直接配置到"全局配置区"。

3、V$RESERVED_WORDS视图

V$RESERVED_WORDS视图记录了数据库系统关键字的相关信息。视图字段含义如下(参考《DM8系统管理员手册》):

KEYWORD:关键字名字
LENGTH:关键字长度
RESERVED:是否是保留字
RES_SQL:是否是SQL保留字,不能作SQL中的标识符
RES_PL:是否是DMSQL程序保留字,不能作DMSQL程序语句块中的标识符
RES_SCHEMA:是否是模式保留字,不能作模式标识符
RES_VARIABLE:是否是变量保留字,不能作变量标识符
RES_ALIAS:是否是别名保留字,不能作别名标识符
RES_FIXED:关键字是否可以EXCLUDE,Y不可以,N可以

注意:

V$RESERVED_WORDS视图中RESERVED=Y的关键字为系统保留字,无法直接在SQL语句中使用。RES_FIXED=Y的保留字是不能屏蔽的,屏蔽会影响使用。

在DM8 1-1-190版本中不能屏蔽的关键字有77个。

使用示例

环境说明

DB:DMV8 1-1-190版本

OS:KylinV10

测试关键字以PERCENT、ORDER为例。其中PERCENT为可排除关键字,ORDER为不可排除关键字。

确认关键字信息:

SQL> select * from v$reserved_words where keyword in ('PERCENT','ORDER');

行号     KEYWORD LENGTH      RESERVED RES_SQL RES_PL RES_SCHEMA RES_VARIABLE RES_ALIAS RES_FIXED
---------- ------- ----------- -------- ------- ------ ---------- ------------ --------- ---------
1          ORDER   5           Y        Y       Y      N          N            N         Y          
2          PERCENT 7           Y        Y       Y      N          N            N         N

第一种方法:修改dm.ini中EXCLUDE_RESERVED_WORDS参数

(1)创建两张表包含测试的关键字(直接使用保留字作为列名)

SQL> create table A (PERCENT VARCHAR(10));
create table A (PERCENT VARCHAR(10));

create table A (PERCENT VARCHAR(10));
                                  *  
第 1 行, 第 35 列[PERCENT]附近出现错误[-2007]:
语法分析出错.
已用时间: 0.459(毫秒). 执行号:0.
SQL> create table B (ORDER VARCHAR(10));
create table B (ORDER VARCHAR(10));

create table B (ORDER VARCHAR(10));
                                *  
第 1 行, 第 33 列[ORDER]附近出现错误[-2007]:
语法分析出错.
已用时间: 0.323(毫秒). 执行号:0.
SQL> 

(2)修改dm.ini中EXCLUDE_RESERVED_WORDS参数

​ 修改后参数为:EXCLUDE_RESERVED_WORDS =PERCENT,ORDER

​ 重启数据库。

(3)创建测试表

SQL> create table A (PERCENT VARCHAR(10));
操作已执行
已用时间: 16.635(毫秒). 执行号:400.
SQL> create table B (ORDER VARCHAR(10));
create table B (ORDER VARCHAR(10));

create table B (ORDER VARCHAR(10));
                                *  
第 1 行, 第 33 列[ORDER]附近出现错误[-2007]:
语法分析出错.
已用时间: 0.409(毫秒). 执行号:0.

通过测试可以发现对于RES_FIXED=Y的保留字,修改dm.ini中EXCLUDE_RESERVED_WORDS参数是无法屏蔽的,对RES_FIXED=N的保留字可以屏蔽。

其余的RES_FIXED=Y的保留字也可以多测试几个。

第二种方法:配置dm_svc.conf文件,添加KEYWORDS配置项

(1)在客户端机器上配置dm_svc.conf文件,添加KEYWORDS配置项

dm_svc.conf 配置如下:

# 全局配置区
TIME_ZONE=(480)
LANGUAGE=(cn)
DB1=(192.168.15.35:5236)

[DB1] 
# 服务配置区
KEYWORDS=PERCENT,ORDER

dm_svc.conf文件在不同平台上的存放路径可以参考《DM8系统管理员手册》。

针对数据库的配置最好是添加在“服务配置区”中,避免存在其他数据库的情况下影响到其他数据库,而且通过配置dm_svc.conf服务名对应用程序更方便。

(2)使用配置的服务名连接

管理工具登录:

image-20210621161340087

创建测试表,均创建成功:

image-20210621161441022

image-20210621161524941

SQL> desc AA;                                             

行号     NAME    TYPE$       NULLABLE
---------- ------- ----------- --------
1          PERCENT VARCHAR(10) Y

已用时间: 31.550(毫秒). 执行号:1200.
SQL> desc BB;

行号     NAME  TYPE$       NULLABLE
---------- ----- ----------- --------
1          ORDER VARCHAR(10) Y

已用时间: 13.170(毫秒). 执行号:1201.

通过测试可以发现对于RES_FIXED=Y的保留字,dm_svc.conf也可以进行屏蔽,但是屏蔽之后可能会导致使用上的问题。

(3)dm_svc.conf屏蔽RES_FIXED=Y的保留字会导致的问题

以ORDER为例:

通过dm_svc.conf屏蔽后,使用dm_svc.conf进行连接的程序,将无法使用数据库中自带的包含单独的order单词的函数等,将会导致程序功能异常。

比如order by等将无法使用:

image-20210621162816431

比如管理工具等程序部分功能出现异常:

image-20210621163325185

注意: 通过dm_svc.conf对保留字进行屏蔽,只影响通过dm_svc.conf进行连接的应用程序,不使用dm_svc.conf不会影响。如下图演示:

image-20210621162431511

image-20210621163643304

总结

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

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

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

(4)如果对象名称加上双引号,即使对象名称是未屏蔽的保留字,对象也可以创建成功。但是在该对象名称上使用SQL语句时,也需要给对象名称加上双引号。
(5)更多资讯请上达梦技术社区了解:https://eco.dameng.com

最后修改时间:2021-06-29 12:23:37
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论