在PostgreSQL中,你知道哪个函数调用了它吗?

在PostgreSQL中,你知道哪个函数调用了它吗?,postgresql,plpgsql,Postgresql,Plpgsql,我有一个触发器,如下所示: CREATE TRIGGER A AFTER INSERT OR UPDATE OR DELETE ON TableA FOR EACH ROW EXECUTE PROCEDURE func1(); 以及触发功能: CREATE OR REPLACE FUNCTION func1() RETURNS trigger AS $BODY$ begin insert into tableinfo values(...); return

我有一个触发器,如下所示:

CREATE TRIGGER A
  AFTER INSERT OR UPDATE OR DELETE
  ON TableA
  FOR EACH ROW
  EXECUTE PROCEDURE func1();
以及触发功能:

CREATE OR REPLACE FUNCTION func1()
  RETURNS trigger AS
$BODY$
begin
    insert into tableinfo values(...);
    return new;
end ;
$BODY$
  LANGUAGE plpgsql VOLATILE
CREATE OR REPLACE FUNCTION insertnewrecord()
 RETURNS void
 LANGUAGE plpgsql
AS $function$
begin
  insert into TableA values(...);
end;
$function$
现在我有很多函数可以插入/更新/删除TableA。 触发器中是否有方法知道哪个函数调用它

比如:

CREATE OR REPLACE FUNCTION func1()
  RETURNS trigger AS
$BODY$
begin
    if functionname='insertnewrecord' or functionname='deleterecord'  then 
        insert into tableinfo values(...);
         return new;
    else
       return NULL;
    end if;
end ;
$BODY$
  LANGUAGE plpgsql VOLATILE

这可行吗?我是否可以根据调用触发器的函数来限制触发器执行某些操作?

您可以使用
get diagnostics
从调用堆栈中获取信息,如前所述

诸如此类:

CREATE OR REPLACE FUNCTION func1()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$
declare
  stack text;
begin
  get diagnostics stack = pg_context;
  raise notice E'--- Call Stack ---\n%',stack;
  ...
return new;
end;
$function$;
测试功能:

CREATE OR REPLACE FUNCTION func1()
  RETURNS trigger AS
$BODY$
begin
    insert into tableinfo values(...);
    return new;
end ;
$BODY$
  LANGUAGE plpgsql VOLATILE
CREATE OR REPLACE FUNCTION insertnewrecord()
 RETURNS void
 LANGUAGE plpgsql
AS $function$
begin
  insert into TableA values(...);
end;
$function$
结果:

select insertnewrecord();
NOTICE:  --- Call Stack ---
PL/pgSQL function func1() line 6 at GET DIAGNOSTICS
SQL statement "insert into tbl values(10)"
PL/pgSQL function insertnewrecord() line 3 at SQL statement
CONTEXT:  SQL statement "insert into tbl values(10)"
PL/pgSQL function insertnewrecord() line 3 at SQL statement
 insertnewrecord 
-----------------

(1 row)

因此,您可以在func1()中分析
堆栈
,并根据它做出决策,尽管这不是很方便。

只需将调用触发器名称作为参数添加到函数中即可?