在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()中分析
堆栈
,并根据它做出决策,尽管这不是很方便。只需将调用触发器名称作为参数添加到函数中即可?