PL / pgSQL触发器 - 仅插入\更新有效元组

时间:2016-12-01 21:39:14

标签: sql postgresql triggers plpgsql

在我的项目中,我有两个关系:
1.节日(标题,start_date,end_date)
2.事件(标题 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();

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

1 个答案:

答案 0 :(得分:0)

你需要:

  • raise 'The new event date is invalid'代替raise notice 'The new event date is invalid'强制在无效日期上输入错误 只是通知,只记录然后被忽略。
  • return NEW,而不是return NULL
  

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