在postgresql中创建触发器
我的触发器有问题:在postgresql中创建触发器,sql,postgresql,triggers,Sql,Postgresql,Triggers,我的触发器有问题: CREATE OR REPLACE FUNCTION process_fillDerivedFrom_used() RETURNS TRIGGER AS $fillDerivedFrom_used$ DECLARE prog varchar(255); current varchar(255); BEGIN SELECT u.iduseentity as prog ,g.idCreatedEntity as current
CREATE OR REPLACE FUNCTION process_fillDerivedFrom_used() RETURNS TRIGGER AS $fillDerivedFrom_used$
DECLARE
prog varchar(255);
current varchar(255);
BEGIN
SELECT u.iduseentity as prog ,g.idCreatedEntity as current
FROM entity e
JOIN used u ON e.identity=u.iduseentity
JOIN activity a ON a.idactivity=u.idusedactivity
JOIN generatedby g ON g.idcreatoractivity=a.idactivity
INSERT INTO DERIVEDFROM VALUES (prog,current)
END;
$fillDerivedFrom_used$ LANGUAGE plpgsql;
CREATE TRIGGER fillDerivedFrom_used
AFTER INSERT OR UPDATE OR DELETE ON emp
FOR EACH ROW EXECUTE PROCEDURE process_fillDerivedFrom_used();
我使用了3个表,查询是正确的,所以我认为错误不是来自这里。但当我在我的终端中复制超过这个触发器时,什么都没有发生,没有错误消息,我可以在终端中写入,但我不能执行任何查询,就像我忘记了触发器中的某些内容,所以我认为它没有完全被创建
我想我混合了我在学校学过的两种语言PL/SQL和postgresql
谢谢你的帮助我不知道你有什么问题。一个是显而易见的。as不用于变量;进入is。此外,还应命名变量,使其不会与列名冲突:
CREATE OR REPLACE FUNCTION process_fillDerivedFrom_used() RETURNS TRIGGER AS $fillDerivedFrom_used$
DECLARE
prog v_varchar(255);
current v_varchar(255);
BEGIN
SELECT u.iduseentity as prog, g.idCreatedEntity as current
INTO v_proc, v_current
FROM entity e JOIN
used u
ON e.identity = u.iduseentity JOIN
activity a
ON a.idactivity = u.idusedactivity JOIN
generatedby g
ON g.idcreatoractivity = a.idactivity
INSERT INTO DERIVEDFROM VALUES (v_prog, v_current)
END;
当然,这就引出了为什么要使用变量的问题:
CREATE OR REPLACE FUNCTION process_fillDerivedFrom_used() RETURNS TRIGGER AS $fillDerivedFrom_used$
BEGIN
INSERT INTO DERIVEDFROM (prog, current) -- or whatever the column names are
SELECT u.iduseentity as prog, g.idCreatedEntity as current
FROM entity e JOIN
used u
ON e.identity = u.iduseentity JOIN
activity a
ON a.idactivity = u.idusedactivity JOIN
generatedby g
ON g.idcreatoractivity = a.idactivity;
END;
我已经做到了,这是工作,谢谢你的帮助
CREATE OR REPLACE FUNCTION process_fillDerivedFromGenby() RETURNS TRIGGER AS $fillDerivedFromgenby$
DECLARE
prog varchar(255);
curent varchar(255);
BEGIN
SELECT u.iduseentity , g.idCreatedEntity into prog,curent
FROM entity e
JOIN used u ON e.identity=u.iduseentity
JOIN activity a ON a.idactivity=u.idusedactivity
JOIN generatedby g ON g.idcreatoractivity=a.idactivity
WHERE g.idCreatedEntity =NEW.idCreatedEntity;
--raise notice 'curent: "%" prog by "%"', curent, prog;
INSERT INTO DERIVEDFROM VALUES(prog,curent);
return new;
END;
$fillDerivedFromgenby$ LANGUAGE plpgsql;
CREATE TRIGGER fillDerivedFromgenby AFTER INSERT ON GENERATEDBY
FOR EACH ROW EXECUTE PROCEDURE process_fillDerivedFromGenby();
您应该选择into变量,而不是别名。。。而且,在select之后没有分号,函数的定义看起来很奇怪——您想查询emp?每行上的四个表联接?。。为什么不插入DERIVEDFROM select…all__your_select。。。?。。请记住-您不操作新的或旧的记录在这里-它看起来根本不像触发功能