检查是否有开始时间>同组的结束时间

时间:2015-05-12 12:10:05

标签: postgresql triggers

我有一个包含日历的数据库。根据我尝试插入的组,应检查NEW启动时间是否晚于组的旧启动时间。

我在考虑这样的事情:

CREATE OR REPLACE FUNCTION check_rooster_tijd() returns trigger AS $BODY$
BEGIN 
    SELECT max(eindtijd) FROM rooster WHERE rooster.groep = NEW.groep;
    RETURN new;
END;
$BODY$

CREATE trigger check_rooster_tijd_trigger BEFORE INSERT or UPDATE ON rooster
FOR EACH ROW EXECUTE PROCEDURE check_rooster_tijd();

然而这不起作用。

我如何解决这个问题,以便我的sql检查时间是否晚于他结束同一组的时间。

CREATE TABLE rooster(
groep               VARCHAR(20)     NOT NULL
,startdatum         DATE            NOT NULL
,starttijd          TIME            NOT NULL
,einddatum          DATE            NOT NULL
,eindtijd           TIME            NOT NULL
,docent             VARCHAR(50)     NOT NULL
,lokaal             VARCHAR(6)      NOT NULL
,check (starttijd < eindtijd)

修改

CREATE OR REPLACE FUNCTION check_rooster_tijd() returns trigger AS $BODY$
BEGIN
    if(SELECT max(eindtijd) from rooster) > new.starttijd THEN
        insert into rooster values (new.groep, new.startdatum, new.starttijd, new.einddatum, new.eindtijd, new.docent, new.lokaal);
        return new;
    END IF;
    RAISE exception 'error %', new;
    return null;
END;
$BODY$ language plpgsql;

CREATE trigger check_rooster_tijd_trigger BEFORE INSERT or UPDATE ON rooster
FOR EACH ROW EXECUTE PROCEDURE check_rooster_tijd();

1 个答案:

答案 0 :(得分:0)

你应该包装你的选择:

SELECT max(eindtijd) FROM rooster WHERE rooster.groep = NEW.groep;

进入if(作为条件)并且如果条件不满足则引发异常。

例如(语法可能不正确,但是为了给你提示):

if (SELECT max(eindtijd) FROM rooster WHERE rooster.groep = NEW.groep)>new.starttijd then
    raise exception 'Incorrect end time!'; 
end;

你可以看到:

http://www.postgresql.org/docs/9.3/static/plpgsql-errors-and-messages.html 有关提出例外和

的更多信息

How to execute PostgreSQL RAISE command dynamically示例。