假设我有一个如下表格: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();
我该如何纠正?
为简单起见,请考虑使用时间戳记字段而不是单独的日期和时间字段。您可以轻松地将时间戳记格式化为日期或时间。
更新成功时,更新和插入触发器必须返回NEW,否则返回FALSE / NULL
为了通过触发器强制执行约束,您必须运行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] 删除。
我来说两句