ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2021-07-12 11:03:32  阅读:518  来源: 互联网

标签:dm RES 屏蔽 保留字 conf SQL ORDER 达梦


前言

​ 当在达梦数据库中创建表等对象时,对象名称使用一些单词时可能会遇到创建失败报错“语法分析错误”,这种情况有可能是遇到了使用的对象名为系统保留字的无法使用。针对这种情况,一般建议修改对象名为系统保留字之外的名称。如果是现有的系统上,一定要使用系统保留字,那么对于部分系统保留字(非所有)可以通过参数屏蔽的方式来处理。
​ 达梦数据库中排除屏蔽系统保留字的方法有两种:
​ 第一种:修改数据库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

标签:dm,RES,屏蔽,保留字,conf,SQL,ORDER,达梦
来源: https://blog.csdn.net/Mrkill123/article/details/118670235

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有