【问题标题】:PL/pgSQL Triggers - Insert\ Update only valid tuplesPL/pgSQL 触发器 - 仅插入\更新有效元组
【发布时间】:2017-04-16 16:41:31
【问题描述】:

在我的项目中,我有两个关系:
1. 节日(title、start_date、end_date)
2. 事件(title, event_date)

如果 event_date 设置在相应节日的 start_date 和 end_date 之间,我必须添加一个触发器来检查何时插入新元组\更新到事件关系。
如果事件行无效,则触发器必须发出通知,否则,必须定期插入/更新元组。
我制作的触发器(在 pl/pgSQL 中):

create function trigf() returns trigger as $$ 
begin
if((NEW.event_date) < (select start_date from festival where festival.title = NEW.title) or
  (NEW.event_date) > (select end_date from festival where festival.title = NEW.title)) then
     raise notice 'The new event date is invalid';
end if;
return null;
end;
$$language plpgsql;

create trigger T
before insert or update on event
for each row
    execute procedure trigf();

问题是我的函数能够检测到无效日期,但它不会插入\更新有效元组。
为了实现这一点,我需要在触发器中进行哪些更改?

【问题讨论】:

    标签: sql postgresql triggers plpgsql


    【解决方案1】:

    你需要:

    • raise 'The new event date is invalid' 而不是 raise notice 'The new event date is invalid' 在无效日期上强制出错 只是注意到,它们只被记录,然后被忽略。
    • return NEW,不是return NULL

    BEFORE 触发的行级触发器可以返回 null 以指示触发器管理器跳过该行的其余操作(即,不触发后续触发器,并且该行不会发生 INSERT/UPDATE/DELETE) .

    【讨论】:

    • 非常感谢!但是有一个问题:当我使用“raise”而不是“raise notice”并且存在无效行时,所有行插入尝试都被取消,但我只想取消无效行的插入。那么我如何使用“raise”来做到这一点?
    • 你不应该忽略错误——你会很抱歉。但是,如果您真的非常需要,那么您可以简单地删除 raise 并执行 if ... then return NULL; else return NEW; end if;
    猜你喜欢
    • 2012-05-27
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多