关于我在达梦数据库走过的坑


关于我在达梦数据库走过的坑

前言

​ 公司推行软件国产化已经有段时间了,期间经历些许的不适应,也踩过好些比较无语的坑点,在经历多次调试得到解决之后,在今日比较充实的时间进行一个总结

锁超时问题(数据库表死锁)

问题描述

​ 此问题主要存在于主动修改表字段时(使用达梦管理工具或者直接使用sql注入都一样),会引起单张表所有操作的无效,同时报错“锁超时”。

​ 对于数据库数据的正常写入写出,并未发现影响

可能引发原因
  • 此处就需要吐槽一下达梦管理工具的ui设计,在使用表操作的时候,会有一个提交按钮。如果操作之后不进行提交(即产生了一个会话,在不提交的情况下,会话不会接触),此时的线程会持续握着数据库的锁,其他同事或者自己下一此再进行表操作时,引发以上问题。
  • 未知的锁占用问题….
解决方式

需要具体罗列出数据库中,对该表的操作所有会话数

select * from v$sessions where trx_id in (select trx_id from V$LOCK) and sql_text like '%表名%';

以防万一,查询所有会话的sess_id,逐步将它关闭

-- sp_close_session(sess_id) 
sp_close_session(139894536012456)

字段关键字问题

问题描述

​ 在创建数据库字段名时,有些表名和关键词重名的话(不区分大小写),会引发语法错误

​ 部分关键词例如:BY,CLOB,COMMIT,COPY等等,参考其他博客

解决方式
  1. 对关键词的字段加引号

    SELECT id ,'comment' from table_name;

    注意:关键字 ROWID、 TRXID、 VERSIONS_STARTTIME、 VERSIONS_ENDTIME、VERSIONS_STARTTRXID、VERSIONS_ENDTRXID 和 VERSIONS_OPERATION 不能作为表的列名,即使加上双引号也不行。

  2. 修改dm_svc.conf文件

  3. 最直接避免使用关键词

数据库引号问题

问题描述

​ 这个不是大问题,对比mysql,总是需要莫名奇妙多加一些引号(单双问题也存在)确保语法正确,在这里归纳一下

情况展示
  1. 小写表名需要使用双引号(大写或者大小写不敏感不需要引号)

​ 单引号成为字符串

​ 无引号显示无效的表或者视图名

  1. 列名(字段名)需要使用双引号(大写或者大小写不敏感不需要引号)

​ 列名不用引号括起,报错“无效的列名”

​ 列名使用单引号括起,列名被当成字符串,显示到查询

  1. 条件语句的字符串需要使用单引号

​ 条件语句的字符串不使用引号括起,报错“无效列名”

​ 条件语句使用双引号括起,报错“无效列名”

  1. 以小写字母为表名的表,在使用dexp导出表的时候,会无法正常导出

因此建议所有的表名或者列名都使用大写,选择大小写敏感

  1. 修改数据库时模式名和表名的引号需要隔开

alter table "SYSTEM_V5"."SYS_USER" add column("CARD_NUMBER" VARCHAR2(200));

等等等等 待完善


文章作者: hyy
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 hyy !
  目录