如何在postgres中冻结字段值?

时间:2017-05-18 14:56:22

标签: postgresql

我想确保稍后无法更改某些必填字段的值。有没有办法在架构级别定义它?

目前,我正在考虑使用记录触发器实现此操作,以便在发现值发生变化时引发异常,但这会让人觉得笨拙。

例如:

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

1 个答案:

答案 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();

当然它不会冻结任何东西。现在你无法通过更新来更改它,除非你禁用触发器,更新并启用触发器。但至少后来需要更改表,而不仅仅是更新