我有一个站点,该站点执行查询以将记录添加到历史记录/审计表中。要存储的数据包括一个可能超过255个字符的文本块,但是new_value
和old_value
的历史表字段是字符变化的(255)。当先前的值超出此限制时,我得到一个值太长的错误。为了避免该错误,我创建了一个函数:
BEGIN
IF char_length(NEW.old_value) > 240 THEN
NEW.old_value := substring(NEW.old_value from 0 for 240) || '...';
END IF;
IF char_length(NEW.new_value) > 240 THEN
NEW.new_value := substring(NEW.new_value from 0 for 240) || '...';
END IF;
RETURN NEW;
END
触发器如下:
CREATE TRIGGER check_history_update
BEFORE INSERT ON my_table
FOR EACH ROW
EXECUTE PROCEDURE truncate_old_value()
由于我将触发器设置为在INSERT之前发生,所以我希望可以在尝试INSERT之前截断数据,但是仍然会引发错误。是否可以在插入之前捕获和修改像这样的坏数据?如果是这样,定义我的函数和触发器的最佳方法是什么?
注意:我在函数中使用了240,而不是255,这给了我一点安全性。
答案 0 :(得分:0)
在调用触发器之前 检查数据长度。
将数据类型更改为text
,以免受到任意限制255的限制。触发器将始终保证长度限制。