如何修改触发器以更新PostgreSQL

时间:2017-01-09 04:06:53

标签: postgresql triggers

这是我的样本表。

CREATE TABLE employee_test(
idTst SERIAL PRIMARY KEY, 
monthDownload VARCHAR(6),
changeDate DATE);

我正在尝试创建一个函数和触发器,它会在更新monthDownload属性时使用当前日期更新changeDate属性。 我有它的功能有一个问题。它更新所有记录而不是更新的记录。

 CREATE OR REPLACE FUNCTION downloadMonthChange() 
 RETURNS TRIGGER AS 
 $$
 BEGIN
 IF NEW.monthDownload <> OLD.monthDownload THEN
 UPDATE employee_test
 SET changeDate = current_date
 where OLD.idTst = NEW.idTst;
 END IF;
 RETURN NEW;
 END;
 $$ 
 Language plpgsql;

触发

Create TRIGGER dataTest
AFTER UPDATE
ON employee_test
FOR EACH ROW
EXECUTE PROCEDURE downloadMonthChange();

当我执行以下Update语句时:

UPDATE  employee_test SET  monthDownload = 'oct12'
WHERE idTst = 1;
  

所有changeDate行都会使用当前日期进行更新。   有没有办法只有一行更改记录,以更新当前日期。

     

enter image description here

1 个答案:

答案 0 :(得分:2)

如果您使用before触发器,则可以直接写入NEW

 CREATE OR REPLACE FUNCTION downloadMonthChange() 
 RETURNS TRIGGER AS 
 $$
 BEGIN
 IF NEW.monthDownload <> OLD.monthDownload THEN
   NEW.changeDate = current_date;
 END IF;
 RETURN NEW;
 END;
 $$ 
 Language plpgsql;

必须使用after触发器时的另一个选项是在where子句中包含主键。您似乎尝试执行此操作,但查询中有一个虚假的OLD。因为where子句只是查看负责触发器调用的记录,而不是限制更新哪些记录。

 IF NEW.monthDownload <> OLD.monthDownload THEN
 UPDATE employee_test
 SET changeDate = current_date
 where idTst = NEW.idTst;
相关问题