使用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();
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
你犯了什么错误?你犯了什么错误?