我想确保稍后无法更改某些必填字段的值。有没有办法在架构级别定义它?
目前,我正在考虑使用记录触发器实现此操作,以便在发现值发生变化时引发异常,但这会让人觉得笨拙。
例如:
BEGIN
IF (TG_OP = 'UPDATE') THEN
IF (NEW.product_id !== OLD.product_id) THEN
RAISE EXCEPTION 'Attempt to change frozen field "product_id" on UPDATE.'
END IF;
END IF;
END
答案 0 :(得分:0)
如果您想在字段上进行比较的触发器,可以通过在trigger itself上指定条件来保存执行:
一个布尔表达式,用于确定触发器函数是否会 实际上是执行。如果指定了WHEN,则该功能仅为 如果条件返回true则调用。在FOR EACH ROW触发器中, WHEN条件可以引用旧行和/或新行值的列 通过分别编写OLD.column_name或NEW.column_name。当然, INSERT触发器不能引用OLD和DELETE触发器无法引用 新的。
例如:
CREATE TRIGGER check_update
BEFORE UPDATE ON accounts
FOR EACH ROW
WHEN (OLD.product_id IS DISTINCT FROM NEW.product_id)
EXECUTE PROCEDURE check_account_update();
当然它不会冻结任何东西。现在你无法通过更新来更改它,除非你禁用触发器,更新并启用触发器。但至少后来需要更改表,而不仅仅是更新