> 文档中心 > 神通数据库常见问题解决方案

神通数据库常见问题解决方案

文章目录

  • 1.事务被回退:, 触发器只能在PL块中调用系统函数
  • 2.新建模式、新建用户
  • 3.神通数据库服务器OSRDB实例 服务启动后停止
  • 4.安装数据库的时候弹出的参数配置程序点不了“下一步”按钮
  • 5.SQL 错误 [40000]: ERROR, 未开启物化视图功能
  • 6.ERROR,Bad numeric input format '1,989.02'
  • 7.神通数据库加密解密操作
  • 8.通过触发器的方式阻止手动修改数据库

1.事务被回退:, 触发器只能在PL块中调用系统函数

当使用insert into 语句插入数据的时候报错的

com.oscar.util.OSQLException: ERROR, 程序逻辑错,事务被回退:, 触发器只能在PL块中调用系统函数

能看到是触发器问题,但是也没找到是哪个地方,问了神通的技术支持也没给回复,我们项目中神通数据库有的版本不报错,通过对比试错发了解决方案如下:

SELECT * FROM INFO_SCHEM.SYS_TRIGGER  WHERE TGNAME LIKE '__MVIEW_LOG_%'drop TRIGGER XX.__MVIEW_LOG_34487_TRG;    --XX是数据库模式名

2.新建模式、新建用户

--新建模式XXX, 即创建表空间CREATE TABLESPACE XXX DATAFILE 'D:\ShenTong\odbs\OSRDB\oscarxxx.dbf' SIZE 200M AUTOEXTEND ON NEXT 10M DEFAULT LOGGING INIT 64k NEXT 64k FILL 70 SPLIT 50 ;--创建用户CREATE USER XXX WITH  DEFAULT TABLESPACE XXX PASSWORD '123456' ;GRANT ROLE SYSDBA TO USER XXX ;

3.神通数据库服务器OSRDB实例 服务启动后停止

神通数据库安装的时候有个选项是自动注册为服务,安装成功后默认增加了两个服务项:代理服务和OSRDB实例服务。如果数据库工作台打开后连接不上,connect refused,要先确保这两个服务是开启状态。这里启动实例服务有时候会秒关,刚启动就悄悄给停了,或报错:服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止
两个原因:

  1. 没有授权文件或者授权文件已经过期,一般是在安装目录下的license文件夹

我本地的授权文件路径:D:\ShenTong\license\oscar.license

  1. 授权文件没有问题,仍启动不了服务。

实例服务已设置自动启动,之前是连接正常的,后来执行了一个错误的新建TABLESPACE表空间的sql(将.dbf放错位置了,不影响db使用但不符合规范),将sql中数据文件改到正确地址执行会报表空间已存在的错误,于是想将原来的.dbf文件删了重新建,关闭神通数据库删文件的时候仍提示文件被占用,于是将实例删了。。。再启动数据库就起不来了,直接启动服务报错:服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止

解决方法:这种情况下报错说明这个服务器实例就不能用了,如果数据库有重要数据且无法备份千万不要做上述删除文件的操作。如果有备份数据或者尚未加入重要数据,可以找到安装目录下bin文件夹中dbconfiger.exe文件执行,先删除原有数据库实例,再新建一个就ok了。
这个时候就看出来定期备份的重要性了。

SQL 错误 [40000]: ERROR, 未开启物化视图功能,如需开启请修改配置参数ENABLE_MVIEW。
com.oscar.util.OSQLException: ERROR, 未开启物化视图功能,如需开启请修改配置参数ENABLE_MVIEW。
神通数据库常见问题解决方案

4.安装数据库的时候弹出的参数配置程序点不了“下一步”按钮

神通数据库常见问题解决方案
这里点击页面上点哪里都不懂,下一步按钮始终是置灰的,直接关了这个配置页面实例也启动不了,愁得慌
首先说一下,这个弹窗实际是个障眼法,这个参数配置弹窗是可以拖动改变大小的,鼠标放在右边边框上变成左右箭头后往右拖一下有看全了,实际上有个完成按钮,参数是默认不用修改的。
神通数据库常见问题解决方案
然后说明一下,这个参数配置弹窗也可以直接点击右上角的X号直接关闭,这样默认实例的参数都是采用默认值,等以后想改哪个参数了再打开参数配置工具就可以了。至于为什么刚才说直接关闭了弹窗实例服务启动不了呢,因为数据库刚刚安装完成,授权文件还没改呢,如果谁的实例服务能启动,这句话当我没说哈(就是默认安装包中的授权文件是没问题的)。

5.SQL 错误 [40000]: ERROR, 未开启物化视图功能

报错信息:

SQL 错误 [40000]: ERROR, 未开启物化视图功能,如需开启请修改配置参数ENABLE_MVIEW。
com.oscar.util.OSQLException: ERROR, 未开启物化视图功能,如需开启请修改配置参数ENABLE_MVIEW。

解决方案:在开始菜单找到神通数据库-参数配置工具(参考上个问题截图),在[参数选项]和[描述]中搜索:ENABLE_MVIEW,定位到此项参数后把参数当前值改为true。

6.ERROR,Bad numeric input format ‘1,989.02’

SQL错误[22018]:ERROR,Bad numeric input format ‘1,989.02’
com.oscar.util.OSQLException:ERROR,Bad numeric input format ‘1,989.02’

  • 分析:通过报错的sql语句定位到报错是在某个表中value数值字段求和的时候产生的,字段定义numeric类型,长度21,小数位数2,所以字段定义也没问题,感觉是数据转换问题,但别的表同样的sql查询方法却没问题。最后定位为生产数据有问题,把字段值输入成文本了,可能神通数据库插入数据的时候校验不严格,而且这个字段正常查的数据也用,逗号(千分符)隔开显示所以忽略了。。。
  • 解决方案:找到报错的那条数据手工改一下。

7.神通数据库加密解密操作

  1. mysql中的md5使用如下oscar自定义函数替代:
CREATE OR REPLACE FUNCTION MD5(passwd IN VARCHAR2)RETURN VARCHAR2ISretval varchar2(32);BEGINretval := utl_raw.cast_to_raw(DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING => passwd)) ;RETURN retval;END;
  1. mysql中加密函数aes_encrypt使用如下oscar自定义函数替代:
CREATE FUNCTION aes_encrypt(input IN text,key IN text)RETURN textISBEGINRETURN ENCRYPT_ORA(input, key, 'aes128_ecb_pkcs5',NULL);END aes_encrypt;
  1. mysql中的解密函数aes_decrypt使用如下oscar自定义函数替代:
CREATE FUNCTION aes_decrypt(input IN text,key IN text)RETURN textISBEGINRETURN DECRYPT_ORA(input, key, 'aes128_ecb_pkcs5',NULL);END aes_decrypt;
  1. mysql中的to_base64()使用oscar中的base64_encoding()替代
  2. mysql中的from_base64()使用oscar中的base64_decoding()替代
    举个项目中常用的例子,在A表中加一个SECRETINFO字段 存放加密后的信息用于防止数据篡改,sql写法如下
UPDATE 模式名.A SET SECRETINFO=base64_encoding(CONCAT(信息密级(随意),ID)) WHERE 1=1;

8.通过触发器的方式阻止手动修改数据库

这里以不允许修改信息密级(公开、机密、秘密、绝密)为例,模式名为SYS,表名为DATAINFO,字段名为MJ,以下代码是触发器方式实现方式:

--不允许直接修改数据  错误码-20600是我随便写的CREATE or replace TRIGGER datainfo_update_triger before updateon SYS.DATAINFO FOR EACH ROWbegin  IF(:NEW.MJ != :OLD.MJ) THEN    RAISE_APPLICATION_ERROR(-20600,'不能修改表密级');  END IF;END;

上面方法实现了不能修改数据库表中某一条记录的mj字段,但是聪明如我还能想到另一种方式,复制整条记录插入进去,这条修改的法子也给禁掉,上条问题的例子中提到过表里有一个字段放了加密信息,逻辑是把ID字段和密级字段拼到一起加密了,我们再次把要插入的ID和密级加密后与原来的值对比就知道是不是同一条记录了,sql如下:

--不允许复制记录插入CREATE or replace TRIGGER datainfo_insert_triger before INSERTon SYS.DATAINFO FOR EACH ROWbegin  IF(:NEW.SECRETINFO!= base64_encoding(CONCAT(:NEW.MJ,:NEW.ID))) THEN    RAISE_APPLICATION_ERROR(-20600,'请确认表密级数据');  END IF;END;

目前就先记录这8个问题,神通数据库是国产数据库,应用范围不如orcle和mysql等广泛,所以网查的资料比较少,少的可怜。但是随着信息安全意识的提高,国产数据库的地位慢慢提高了,如果大家遇到关于神通的问题可以留言讨论一下。