我正在编写一个触发器,如果条件不成立,则需要引发异常。应该导致加注的条件是正在修改的当前行有一个字段enrolled
为空,并且正在修改的行的主键没有出现在其他 6 个表中的一个表中。
(我知道这是一个糟糕的设计,但这是我继承的,我对我们的 DBMS,postgresql 的更高级功能没有太多经验)。
我对我的触发器很满意,但是我在编写触发器应该执行的过程时遇到了问题:这是我目前所拥有的,诚然这并不多:
CREATE FUNCTION ensure_consistent_enrolled()
RETURNS trigger AS $$
BEGIN
RAISE EXCEPTION 'User not enrolled plan'
USING HINT = 'Ensure user is enrolled in a plan'
END;
$$ LANGUAGE plpgsql;
我试图在存储过程中实现的是:
enrolled_in_plan = OLD.automatic_payments || !(OLD.id in one of 6 tables)
if <> enrolled_in_plan
raise...
end
引发异常不是您经常做的事情。但是,如果这是你的情况......
您的触发函数可能看起来类似于:
我不确定何时应触发此触发器。我认为它应该在更新之前被解雇。我认为在 INSERT 之前/之后触发它是没有意义的;并且根本不知道在删除之前也触发是否明智。
如果你只需要在更新时检查这个条件,你会
这是一个坏主意。创建单个表。
使所有这六个表都通过引用它
FOREIGN KEY
。然后将您的新表链接到其中现在你有一个地方可以检查,它是在一个索引上完成的,你有真正的参照完整性。你可以控制删除 id 时发生的事情。