如何在PostgresSQL中为多个模式和表创建触发器函数

时间:2018-12-13 14:53:37

标签: sql postgresql plpgsql database-trigger

如何在PostgresSQL中为多个模式和表创建触发函数。

我需要用于多个表和架构的单个函数。

尝试以下代码。

功能:

CREATE OR REPLACE FUNCTION public.update_modifiedUser(pSchemaName text, pTableName text)
                RETURNS  trigger AS
$BODY$
DECLARE
vUserid   numeric;
BEGIN
                select t.userid into vUserid from public.user_login_details t where inet (t.systemid) = inet_client_addr() order by t.id desc limit 1;
                UPDATE pSchemaName||.||pTableName SET modified_user = vUserid ,modified_date = now() WHERE ID = NEW.ID;
                RETURN NEW;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

触发:

CREATE TRIGGER trg_modUser_aerial
  BEFORE UPDATE OF geom
  ON sandiego.aerial
  FOR EACH ROW
  EXECUTE PROCEDURE public.update_modifiedUser('sandiego','aerial');

在运行函数时出现此错误:

  

错误:触发器函数不能具有已声明的参数

     

提示:可以通过TG_NARGS访问触发器的参数   和TG_ARGV。

     

上下文:附近的PL / pgSQL函数“ update_modifieduser”的编译   第1行

让我知道我的功能有何变化

1 个答案:

答案 0 :(得分:0)

在您所处的位置,我会SET search_path适当地出现在函数体中,那么您无需对函数内部的对象进行模式限定,并且无需太多动态SQL就可以工作。

您可以从TG_TABLE_SCHEMA变量中获取表的架构,也可以将其作为参数传递给CREATE TRIGGER中的触发函数,并从TG_ARGV[]中读取。

请参见the documentation