关于我在达梦数据库走过的坑
前言
公司推行软件国产化已经有段时间了,期间经历些许的不适应,也踩过好些比较无语的坑点,在经历多次调试得到解决之后,在今日比较充实的时间进行一个总结
锁超时问题(数据库表死锁)
问题描述
此问题主要存在于主动修改表字段时(使用达梦管理工具或者直接使用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等等,参考其他博客
解决方式
对关键词的字段加引号
SELECT id ,'comment' from table_name;
注意:关键字 ROWID、 TRXID、 VERSIONS_STARTTIME、 VERSIONS_ENDTIME、VERSIONS_STARTTRXID、VERSIONS_ENDTRXID 和 VERSIONS_OPERATION 不能作为表的列名,即使加上双引号也不行。
修改dm_svc.conf文件
最直接避免使用关键词
数据库引号问题
问题描述
这个不是大问题,对比mysql,总是需要莫名奇妙多加一些引号(单双问题也存在)确保语法正确,在这里归纳一下
情况展示
- 小写表名需要使用双引号(大写或者大小写不敏感不需要引号)
单引号成为字符串
无引号显示无效的表或者视图名
- 列名(字段名)需要使用双引号(大写或者大小写不敏感不需要引号)
列名不用引号括起,报错“无效的列名”
列名使用单引号括起,列名被当成字符串,显示到查询
- 条件语句的字符串需要使用单引号
条件语句的字符串不使用引号括起,报错“无效列名”
条件语句使用双引号括起,报错“无效列名”
- 以小写字母为表名的表,在使用dexp导出表的时候,会无法正常导出
因此建议所有的表名或者列名都使用大写,选择大小写敏感
- 修改数据库时模式名和表名的引号需要隔开
alter table "SYSTEM_V5"."SYS_USER" add column("CARD_NUMBER" VARCHAR2(200));
等等等等 待完善