Postgresql触发器会导致服务器在被触发时过载

时间:2018-07-22 00:35:34

标签: sql postgresql odoo

我在pgadmin上创建了一个触发器,当在触发该触发器的表上插入新记录时,出现错误:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">

500内部服务器错误

内部服务器错误

服务器遇到内部错误,无法完成您的请求。服务器过载或应用程序错误。

触发代码:

CREATE OR REPLACE FUNCTION get_user_id_from_hr_emplyee_into_namerel()
      RETURNS trigger LANGUAGE plpgsql
        AS $$ 

    DECLARE
        logged_user_id              INTEGER;
    BEGIN
      SELECT distinct resource.user_id FROM hr_employee emp 
    LEFT JOIN resource_resource resource ON resource.id=emp.resource_id  where emp.id=new.employee_id into logged_user_id ;  

     IF ( logged_user_id <> null) THEN 
     new.namerel=logged_user_id;
     END IF;

     RETURN null;
    END;
    $$;


    CREATE TRIGGER last_name_changes
      BEFORE Insert or UPDATE
      ON hr_payslip
      FOR EACH ROW
      EXECUTE PROCEDURE get_user_id_from_hr_emplyee_into_namerel();

2 个答案:

答案 0 :(得分:0)

PLPGSQL SELECT ... INTO必须始终返回不超过一行,否则您将得到错误。

答案 1 :(得分:0)

更改后,它将为我运行。

  CREATE OR REPLACE FUNCTION get_user_id_from_hr_emplyee_into_namerel()
  RETURNS trigger LANGUAGE plpgsql
    AS $$ 

DECLARE
    logged_user_id              INTEGER;
BEGIN
  SELECT distinct resource.user_id into logged_user_id FROM hr_employee emp 
LEFT JOIN resource_resource resource ON resource.id=emp.resource_id  where emp.id=new.employee_id;  

new.namerel=logged_user_id;
 --IF ( logged_user_id <> null) THEN 

 --END IF;

 RETURN new;
END;
$$;


CREATE TRIGGER last_name_changes
  BEFORE Insert or UPDATE
  ON hr_payslip
  FOR EACH ROW
  EXECUTE PROCEDURE get_user_id_from_hr_emplyee_into_namerel();