数据库关键字整理之——检查是否使用了关键字

关键字是指在数据库中有意义的字,通常是数据库内部使用, 不能用于命名用户的数据对象。 有的数据库还会详细划分,例如分为关键字,候选字,甚至更详细的分类。分类的标准例如有的是绝对不可以使用,有的通过一定手段例如添加双引号可以使用。
我们为了方便统一称之为关键字,通常用户编写的对象中使用关键字会造成错误或不确定的影响,为了避免这个问题,用户应该避免使用数据库的关键字(含保留字或其他保留别名等)。

这个系列主要整理了各大数据库的关键字,可以用于建库,建表,写存储过程,函数等场景避免冲突。

本篇是写个脚本来检查是否使用关键字。首先是把把关键字分类存入数据库表中,然后比对该表和数据库的数据对象看是否有使用了关键字, 原理很简单,也比较实用。
为了减少篇幅, 只演示了 Oracle 和 MySQL , 其他数据库请自行改写。


9de7bb31d0644e7393039222babfed10

欢迎收藏。

检查关键字语句

1. 建表

ORACLE

create table T_KEYWORD_LIST
(
DB_NAME VARCHAR2(30) not null,
MATCH_TYPE CHAR(1) not null,
KEY_WORD VARCHAR2(50)
);
comment on table T_KEYWORD_LIST is '数据库关键字';
comment on column T_KEYWORD_LIST.DB_NAME is '数据库名称';
comment on column T_KEYWORD_LIST.MATCH_TYPE is '匹配类型: 0: 全匹配 1: 前缀匹配';
comment on column T_KEYWORD_LIST.KEY_WORD is '关键字';
CREATE OR REPLACE VIEW V_KEYWORD_LIST
AS
SELECT KEY_WORD,LISTAGG (DB_NAME, ',') WITHIN GROUP (ORDER BY DB_NAME) DB_NAME
FROM (SELECT DISTINCT UPPER(KEY_WORD) KEY_WORD,UPPER(DB_NAME) DB_NAME FROM T_KEYWORD_LIST WHERE MATCH_TYPE='0')
GROUP BY KEY_WORD;
CREATE OR REPLACE VIEW V_CHECK_KEYWORD AS
SELECT OBJECT_TYPE,OBJECT_NAME,KEY_WORD,DB_NAME -- 查看对象是否试用了数据库关键字(保留字/非保留字)
FROM USER_OBJECTS, V_KEYWORD_LIST
WHERE UPPER(OBJECT_NAME) = UPPER(KEY_WORD)
UNION ALL
SELECT 'COLUMN' OBJECT_TYPE, CONCAT(CONCAT(TABLE_NAME,'.'),COLUMN_NAME) OBJECT_NAME,KEY_WORD ,DB_NAME -- 查看列是否使用了关键字(保留字/非保留字)
FROM USER_TAB_COLUMNS, V_KEYWORD_LIST
WHERE UPPER(COLUMN_NAME) = UPPER(KEY_WORD)
ORDER BY 1,2,3;
GRANT SELECT ON V_CHECK_KEYWORD TO PUBLIC;
CREATE OR REPLACE PUBLIC SYNONYM CHECK_KEYWORD FOR SYSTEM.V_CHECK_KEYWORD;

MySQL

DROP TABLE IF EXISTS `T_KEYWORD_LIST`;
CREATE TABLE `mysql`.`T_KEYWORD_LIST` (
`DB_NAME` varchar(30) NULL COMMENT '数据库名称',
`MATCH_TYPE` char(1) NULL COMMENT '匹配类型: 0: 全匹配 1: 前缀匹配',
`KEY_WORD` varchar(50) NULL COMMENT '关键字'
) COMMENT = '数据库关键字';

CREATE OR REPLACE VIEW V_KEYWORD_LIST
AS
SELECT KEY_WORD,group_concat(DB_NAME ORDER BY DB_NAME) DB_NAME
FROM (SELECT DISTINCT UPPER(KEY_WORD) KEY_WORD,UPPER(DB_NAME) DB_NAME FROM T_KEYWORD_LIST WHERE MATCH_TYPE='0') K
GROUP BY KEY_WORD;

CREATE OR REPLACE VIEW CHECK_KEYWORD AS
select table_schema schema_name,table_type object_type,table_name object_name,KEY_WORD ,DB_NAME -- 查看对象是否试用了数据库关键字(保留字/非保留字)
from information_schema.tables, mysql.V_KEYWORD_LIST
where table_name = KEY_WORD
and table_schema=database()
union all
select routine_schema schema_name,routine_type object_type,routine_name object_name,KEY_WORD,DB_NAME
from information_schema.routines, mysql.V_KEYWORD_LIST
where routine_name = KEY_WORD
and routine_schema=database()
union all
select trigger_schema schema_name,'trigger' as object_type,trigger_name object_name,KEY_WORD,DB_NAME
from information_schema.triggers, mysql.V_KEYWORD_LIST
where trigger_name = KEY_WORD
and trigger_schema=database()
union all
select event_schema schema_name,'event' as object_type,event_name object_name,KEY_WORD ,DB_NAME
from information_schema.events, mysql.V_KEYWORD_LIST
where event_name = KEY_WORD
and event_schema=database()
union all
select table_schema schema_name,'column' as object_type,concat(table_name,'.',column_name) as object_name,KEY_WORD,DB_NAME -- 查看列是否使用了关键字(保留字/非保留字)
from information_schema.columns, mysql.V_KEYWORD_LIST
where column_name = KEY_WORD
and table_schema=database()
order by 1,3,2,4;

GRANT SELECT ON mysql.CHECK_KEYWORD TO 'USER1'@'%'; -- 更多用户

2.数据准备

-- Oracle

@db.keyword.sql

-- MySQL

show variables like 'character%';

set character_set_client=utf8mb4;

set character_set_connection=utf8mb4;

source db.keyword.sql

检查

-- oracle
SELECT * FROM CHECK_KEYWORD

-- MySQL
SELECT * from mysql.CHECK_KEYWORD

附录 db.keyword.sql

类似下面这样把所有关键字都存入表中, 很简单, 费时间,太大了,贴不上, 可以自己整理,嫌麻烦的话也可以关注私信我发给你。

-- Oracle
INSERT INTO T_KEYWORD_LIST VALUES ('Oracle','0','ACCESS');
INSERT INTO T_KEYWORD_LIST VALUES ('Oracle','0','ADD');

猜你喜欢

转载自blog.csdn.net/weixin_44496870/article/details/130946549