使用2个表触发postgresql

使用2个表触发postgresql,postgresql,plpgsql,database-trigger,Postgresql,Plpgsql,Database Trigger,我有三张桌子: 员工(eid、ename、工资、did、分类) 项目(pid、pname、did、预算、截止日期) Onproject(pid、eid、fromdate) 我尝试编写触发器,检查向Onproject插入新员工时,duedate是否大于fromdate后的一个月,如果不返回错误消息,记录将不会添加到表中 我试过了 CREATE TRIGGER T1 BEFORE INSERT ON Onproject FOR EACH ROW EXECUTE PROCEDURE trigf1();

我有三张桌子:

  • 员工(eid、ename、工资、did、分类)
  • 项目(pid、pname、did、预算、截止日期)
  • Onproject(pid、eid、fromdate)
  • 我尝试编写触发器,检查向Onproject插入新员工时,duedate是否大于fromdate后的一个月,如果不返回错误消息,记录将不会添加到表中

    我试过了

    CREATE TRIGGER T1
    BEFORE INSERT
    ON Onproject
    FOR EACH ROW
    EXECUTE PROCEDURE trigf1();
    
    create or replace function trigf1() returns trigger as
    $BODY$ BEGIN
    IF (DATE_PART('day', NEW.fdate::date) - DATE_PART('day', duedate::date) > 30)
    THEN insert into Onproject values (NEW.pid, NEW.eid, NEW.fdate)
    else
    rais notice 'adding employee to the project failed, less then one month to due date.'
    end if
    end
    $BODY$
    LANGUAGE PLPGSQL VOLATILE
    
    但是触发器不知道duedate字段和项目表


    如何使用Project和Onproject表创建触发器?

    您没有从触发器返回任何内容。如果希望插入继续,只需返回
    new
    行,如果希望插入失败,则需要引发错误

    您还需要在项目表上运行select来检索duedate,您不能凭空获取它:

    create or replace function trigf1() returns trigger as
    $BODY$ 
    declare
      l_duedate date;
    BEGIN
      -- get the duedate for the project
      select duedate 
        into l_duedate
      from project
      where pid = new.pid;
    
      IF l_duedate > NEW.fromdate::date + interval '1 month'
      THEN  
         -- everything OK, proceed with the insert
         return new;
      end if;
    
      -- using raise error, aborts the transaction
      raise error 'adding employee to the project failed, less then one month to due date.'
    end;
    $BODY$
    LANGUAGE PLPGSQL VOLATILE
    

    您没有从触发器返回任何内容。如果希望插入继续,只需返回
    new
    行,如果希望插入失败,则需要引发错误

    您还需要在项目表上运行select来检索duedate,您不能凭空获取它:

    create or replace function trigf1() returns trigger as
    $BODY$ 
    declare
      l_duedate date;
    BEGIN
      -- get the duedate for the project
      select duedate 
        into l_duedate
      from project
      where pid = new.pid;
    
      IF l_duedate > NEW.fromdate::date + interval '1 month'
      THEN  
         -- everything OK, proceed with the insert
         return new;
      end if;
    
      -- using raise error, aborts the transaction
      raise error 'adding employee to the project failed, less then one month to due date.'
    end;
    $BODY$
    LANGUAGE PLPGSQL VOLATILE
    

    你犯了什么错误?你犯了什么错误?