当使用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是数据库模式名
--新建模式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 ;
神通数据库安装的时候有个选项是自动注册为服务,安装成功后默认增加了两个服务项:代理服务和OSRDB实例服务。如果数据库工作台打开后连接不上,connect refused,要先确保这两个服务是开启状态。这里启动实例服务有时候会秒关,刚启动就悄悄给停了,或报错:服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止。
两个原因:
我本地的授权文件路径:D:\ShenTong\license\oscar.license
实例服务已设置自动启动,之前是连接正常的,后来执行了一个错误的新建TABLESPACE表空间的sql(将.dbf放错位置了,不影响db使用但不符合规范),将sql中数据文件改到正确地址执行会报表空间已存在的错误,于是想将原来的.dbf文件删了重新建,关闭神通数据库删文件的时候仍提示文件被占用,于是将实例删了。。。再启动数据库就起不来了,直接启动服务报错:服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止。
解决方法:这种情况下报错说明这个服务器实例就不能用了,如果数据库有重要数据且无法备份千万不要做上述删除文件的操作。如果有备份数据或者尚未加入重要数据,可以找到安装目录下bin文件夹中dbconfiger.exe文件执行,先删除原有数据库实例,再新建一个就ok了。
这个时候就看出来定期备份的重要性了。
SQL 错误 [40000]: ERROR, 未开启物化视图功能,如需开启请修改配置参数ENABLE_MVIEW。
com.oscar.util.OSQLException: ERROR, 未开启物化视图功能,如需开启请修改配置参数ENABLE_MVIEW。
这里点击页面上点哪里都不懂,下一步按钮始终是置灰的,直接关了这个配置页面实例也启动不了,愁得慌
首先说一下,这个弹窗实际是个障眼法,这个参数配置弹窗是可以拖动改变大小的,鼠标放在右边边框上变成左右箭头后往右拖一下有看全了,实际上有个完成按钮,参数是默认不用修改的。
然后说明一下,这个参数配置弹窗也可以直接点击右上角的X号直接关闭,这样默认实例的参数都是采用默认值,等以后想改哪个参数了再打开参数配置工具就可以了。至于为什么刚才说直接关闭了弹窗实例服务启动不了呢,因为数据库刚刚安装完成,授权文件还没改呢,如果谁的实例服务能启动,这句话当我没说哈(就是默认安装包中的授权文件是没问题的)。
报错信息:
SQL 错误 [40000]: ERROR, 未开启物化视图功能,如需开启请修改配置参数ENABLE_MVIEW。
com.oscar.util.OSQLException: ERROR, 未开启物化视图功能,如需开启请修改配置参数ENABLE_MVIEW。
解决方案:在开始菜单找到神通数据库-参数配置工具(参考上个问题截图),在[参数选项]和[描述]中搜索:ENABLE_MVIEW,定位到此项参数后把参数当前值改为true。
SQL错误[22018]:ERROR,Bad numeric input format ‘1,989.02’
com.oscar.util.OSQLException:ERROR,Bad numeric input format ‘1,989.02’
CREATE OR REPLACE FUNCTION MD5(
passwd IN VARCHAR2)RETURN VARCHAR2
IS
retval varchar2(32);
BEGIN
retval := utl_raw.cast_to_raw(DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING => passwd)) ;
RETURN retval;
END;
CREATE FUNCTION aes_encrypt(input IN text,
key IN text)
RETURN text
IS
BEGIN
RETURN ENCRYPT_ORA(input, key, 'aes128_ecb_pkcs5',NULL);
END aes_encrypt;
CREATE FUNCTION aes_decrypt(input IN text,
key IN text)
RETURN text
IS
BEGIN
RETURN DECRYPT_ORA(input, key, 'aes128_ecb_pkcs5',NULL);
END aes_decrypt;
UPDATE 模式名.A SET SECRETINFO=base64_encoding(CONCAT(信息密级(随意),ID)) WHERE 1=1;
这里以不允许修改信息密级(公开、机密、秘密、绝密)为例,模式名为SYS,表名为DATAINFO,字段名为MJ,以下代码是触发器方式实现方式:
--不允许直接修改数据 错误码-20600是我随便写的
CREATE or replace TRIGGER datainfo_update_triger before update
on SYS.DATAINFO FOR EACH ROW
begin
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 INSERT
on SYS.DATAINFO FOR EACH ROW
begin
IF(:NEW.SECRETINFO!= base64_encoding(CONCAT(:NEW.MJ,:NEW.ID))) THEN
RAISE_APPLICATION_ERROR(-20600,'请确认表密级数据');
END IF;
END;
目前就先记录这8个问题,神通数据库是国产数据库,应用范围不如orcle和mysql等广泛,所以网查的资料比较少,少的可怜。但是随着信息安全意识的提高,国产数据库的地位慢慢提高了,如果大家遇到关于神通的问题可以留言讨论一下。