由于最终用户的键盘配置不当,有时会将某些无效字符插入数据库。
我们有一个pl / sql脚本,它遍历所有列并替换无效字符。该脚本只需不到一分钟即可完成(但我们的系统仍然是测试版,并未广泛使用)。
一种解决方案是创建一个触发器,在插入表之前替换无效字符,一个解决方案是使用预定作业来运行所谓的脚本。
哪一个更有效率?
答案 0 :(得分:3)
如果您使用预定作业,则仍有一段时间无效字符在您的数据中。如果不是这种情况非常重要,请使用触发器。触发器将确保数据库仅包含有效字符。
我认为效率在这里并不重要。触发器可以轻松跟上用户的数据输入。
答案 1 :(得分:1)
说实话,不是诱惑者的粉丝。
您可以通过提供标识需要更新的行的索引来提高预定作业的效率。
一般来说,语法类似于:
create index my_speshul_index on my_table(
case when some_expression then 1 else null end);
some_expression是检测这些字符是否存在的表达式 - 可能是regexp_like。
然后你会查询:
select ... from my_table
where case when some_expression then 1 else null end;
答案 2 :(得分:0)
另一种方法是允许数据按原始类型进入数据库,但创建一个包含已清理数据的虚拟列。
但是,如果问题仅限于几列,那么这是可行的。由于它可以是所有用户可输入的列,因此使用regexp_replace的触发器似乎是最好的方法。根据您允许的字符,它可以像一系列语句一样简单,如
:new.columnA := regexp_replace(:new.ColumnA,'[^[:print:]]','');
也就是说,只需删除所有不可打印的字符。