2016-02-17 99 views
0

我有一個功能,如下觸發:PostgreSQL觸發不點火

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 RETURN false; 
END IF; 
RETURN NEW; 
END; 
$logupdate$ LANGUAGE plpgsql; 

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

,如果有一個古老的時間在我的表中的觸發器應檢測是否新的輸入已與以前的時間重疊,例如[ 11:00 - 13:00],新的輸入是[12:00 - 14:00],那麼觸發器應該觸發並停止插入。 但是,它不能在我的電腦上工作,這裏有什麼問題?

回答

1

您的觸發器會針對每一行執行。您不需要查詢表格。您已經可以訪問舊的和新的行。

CREATE FUNCTION update() RETURNS TRIGGER AS $logupdate$ 
BEGIN 
IF (NEW.starttime, NEW.endtime) OVERLAPS (OLD.starttime, OLD.endtime) THEN 
RETURN false; 
END IF; 
RETURN NEW; 
END; 
$logupdate$ LANGUAGE plpgsql; 

但是,這是超效率的。您應該考慮使用一個排除約束http://www.postgresql.org/docs/9.0/static/ddl-constraints.html

我敢肯定有一個排他條件將與OVERLAPS

+0

THX徵求意見工作,但是我得到以下「ERROR:記錄‘老’尚未分配」有沒有辦法來解決這個問題? –

+1

哦,對不起。 OLD實際上沒有定義,因爲它是'BEFORE UPDATE'觸發器。我的錯。如果您只想在更新上執行此操作,並且只關心更新是否與之前的值重疊,則可能需要將其更改爲AFTER更新,並在發生故障時引發異常。否則,我真的只是使用排除約束http://stackoverflow.com/questions/10616099/postgres-date-overlapping-constraint – Falmarri