由于最终用户的键盘配置不正确,某些无效字符有时会插入到数据库中。
我们有一个 pl/sql 脚本,它遍历所有列并替换无效字符。该脚本只需不到一分钟即可完成(但我们的系统仍处于测试阶段,并未广泛使用)。
一种解决方案是创建一个触发器,在插入表之前替换无效字符,一种解决方案是使用计划作业来运行所谓的脚本。
哪一个更有效率?
由于最终用户的键盘配置不正确,某些无效字符有时会插入到数据库中。
我们有一个 pl/sql 脚本,它遍历所有列并替换无效字符。该脚本只需不到一分钟即可完成(但我们的系统仍处于测试阶段,并未广泛使用)。
一种解决方案是创建一个触发器,在插入表之前替换无效字符,一种解决方案是使用计划作业来运行所谓的脚本。
哪一个更有效率?
如果您使用计划作业,则无效字符仍会在一段时间内出现在您的数据中。如果不是这种情况非常重要,请使用触发器。触发器将确保数据库仅包含有效字符。
我不认为效率在这里很重要。触发器可以轻松跟上用户的数据输入。
老实说,不是触发器的粉丝。
您可以通过提供标识需要更新的行的索引来提高计划作业的效率。
一般来说,语法类似于:
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;
另一种方法是允许数据按原始类型进入数据库,但创建一个包含已清理数据的虚拟列。
但是,这只有在问题仅限于几列时才可行。由于它可以是所有用户可输入的列,因此带有 regexp_replace 的触发器似乎是最好的方法。根据您允许的字符,它可以像一系列语句一样简单,例如
:new.columnA := regexp_replace(:new.ColumnA,'[^[:print:]]','');
也就是说,只需删除所有不可打印的字符。