PostgreSQL如何编写触发器

汤姆·黎明

假设我有一个如下表格:http : //i.stack.imgur.com/qU3gh.png其中sid代表水手ID,bid代表船ID。

我想编写一个触发器和一个函数来检测新输入是否无效。看表,第三条记录不应该在那儿,因为租用时间与前一条重叠,一艘船在归还之前无法租用。也就是说,我想要一个触发器和一个函数来停止输入,例如第3个,当有人尝试提供第3个输入时,它只会阻止您这样做。

目前,我编写了以下代码,但是由于这是我的新手,所以我真的不确定它是否正确:

CREATE FUNCTION update() RETURNS TRIGGER AS $logupdate$ 
DECLARE
judge boolean;
BEGIN 
judge := EXECUTE ( 'SELECT starttime,endtime,NEW.starttime,NEW.endtime FROM reserves WHERE bid = NEW.bid AND startdate = NEW.startdate AND (starttime,endtime) overlaps(NEW.starttime,NEW.endtime) IS NULL'); 
IF judge = f THEN RAISE EXCEPTION 'failed due to some reasons'; 
END IF;
RETURN NEW; 
END;
$logupdate$ LANGUAGE plpgsql;

CREATE TRIGGER logupdate 
before UPDATE ON reserves 
FOR EACH ROW 
EXECUTE PROCEDURE update();

我该如何纠正?

陈大卫
  1. 为简单起见,请考虑使用时间戳记字段而不是单独的日期和时间字段。您可以轻松地将时间戳记格式化为日期或时间。

  2. 更新成功时,更新和插入触发器必须返回NEW,否则返回FALSE / NULL

  3. 为了通过触发器强制执行约束,您必须运行BEFORE UPDATE触发器,否则该行已添加。

    CREATE TRIGGER logupdate 
    BEFORE UPDATE ON reserves 
    FOR EACH ROW EXECUTE PROCEDURE update();
    
    CREATE FUNCTION update() RETURNS TRIGGER AS $$
    BEGIN
      minstart :=  EXECUTE ( 'SELECT MAX(endtime) FROM reserves WHERE bid = NEW.bid AND startdate = NEW.startdate' )   ;
      IF minstart < NEW.starttime THEN RETURN FALSE;
      RETURN NEW;
    END
    $$
    

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章