Postgresql触发器运行不停?

时间:2014-05-10 09:25:38

标签: sql postgresql triggers

我尝试在这里使用触发器。 我有这样的关系:

salary(salaryid, userid, netsalary, reward, totalsalary)

因此,每次插入和更新totalsalarynetsalary时,我都要更新reward,它会重新计算:totalsalary = netsalary + reward

为此,我做了一个功能和一个触发器:

CREATE FUNCTION reCount()
  RETURNS TRIGGER AS $function$
BEGIN 
  UPDATE salary SET totalsalary = netsalary + reward;
  RETURN NEW;
END;

CREATE TRIGGER updateTotalsalary
  AFTER INSERT OR UPDATE
  ON salary
  FOR EACH ROW
  EXECUTE PROCEDURE reCount();

最后,我尝试通过这样的查询插件进行测试:

INSERT INTO salary(salaryid,userid,netsalary,reward,totalsalary) 
    VALUES (1234,123, 30,2,30);

但它运行了很长时间,似乎永远不会停止。因此,当试图阻止它时,我得到了许多行:

  

SQL语句" UPDATE工资SET totalsalary = netsalary + reward"
  PL / pgSQL函数" reCount()" SQL语句中的第3行

那么问题是什么。希望你们能给我一些建议吗?

2 个答案:

答案 0 :(得分:0)

尝试:

CREATE TRIGGER updateTotalsalary 
AFTER INSERT OR UPDATE 
ON salary 
FOR EACH ROW
WHEN (pg_trigger_depth() = 0)
EXECUTE PROCEDURE reCount();

答案 1 :(得分:0)

这可能比pg_trigger_depth() = 0黑客更好:

CREATE TRIGGER updateTotalsalary 
AFTER INSERT OR UPDATE OF netsalary, reward
ON salary 
FOR EACH ROW
EXECUTE PROCEDURE reCount();
  

对于UPDATE事件,可以使用指定列的列表   这句语法:

     

更新了column_name1 [,column_name2 ...]

     

只有至少有一个列出的列时,触发器才会触发   提到作为UPDATE命令的目标。

虽然我个人可能会选择没有总计列的表格及其中的视图(CREATE TABLE salary_ ...CREATE VIEW salary AS SELECT ..., (salary + reward) AS totalsalary FROM salary_)。

相关问题