如何在日志文件中查看触发器函数
How do I see trigger functions in the log files
我有一个 table charass
table 我有一个触发器
CREATE TRIGGER charassheattrigger
BEFORE INSERT OR UPDATE
ON public.charass
FOR EACH ROW
EXECUTE PROCEDURE public._charassheattrigger();
这个触发器执行的函数看起来像
CREATE OR REPLACE FUNCTION public._charassheattrigger()
RETURNS trigger
LANGUAGE 'plpgsql'
COST 100
VOLATILE
AS $BODY$
BEGIN
IF (TG_OP = 'INSERT' OR (TG_OP = 'UPDATE' AND OLD.charass_value <> NEW.charass_value)) AND NEW.charass_char_id = 34 THEN
IF NOT EXISTS(SELECT true FROM heat WHERE heat_number = NEW.charass_value) THEN
INSERT INTO heat (heat_number,heat_created,heat_vend_id)
SELECT NEW.charass_value,NOW(), order_vend_id
FROM ls
JOIN detail ON (ls_id = detail_ls_id)
JOIN hist ON (detail_hist_id = hist_id)
JOIN order ON (hist_order_id = order_id)
WHERE hist_ordtype = 'PO' AND hist_transtype = 'RP' AND ls_id = NEW.charass_target_id;
END IF;
END IF;
RETURN NEW;
END;
$BODY$;
当我查看日志文件时。我可以看到执行的语句
statement: INSERT INTO charass (charass_value, charass_target_type, charass_target_id, charass_char_id) VALUES ('123456789', 'LS', 1234, 34)
我查看热度 table 希望看到 heat_number 为“123456789”的记录,但热度 table 中没有任何内容。
于是我打开 pg admin 并复制上面的语句并手动执行它。现在热火有记录table。
手动插入和应用程序插入有什么区别。有办法告诉吗?声明后面的用户名是相同的,所以它不能是许可的事情。我想知道是否有某种方法可以将信息从触发器函数发送到日志文件,以便我查看它
将 auto_explain
添加到 postgresql.conf
中的 shared_preload_libraries
以及这些附加参数:
auto_explain.log_nested_statements = on
auto_explain.log_min_duration = 0
然后重启 PostgreSQL。
现在您将记录函数内的语句及其执行计划。
我有一个 table charass
table 我有一个触发器
CREATE TRIGGER charassheattrigger
BEFORE INSERT OR UPDATE
ON public.charass
FOR EACH ROW
EXECUTE PROCEDURE public._charassheattrigger();
这个触发器执行的函数看起来像
CREATE OR REPLACE FUNCTION public._charassheattrigger()
RETURNS trigger
LANGUAGE 'plpgsql'
COST 100
VOLATILE
AS $BODY$
BEGIN
IF (TG_OP = 'INSERT' OR (TG_OP = 'UPDATE' AND OLD.charass_value <> NEW.charass_value)) AND NEW.charass_char_id = 34 THEN
IF NOT EXISTS(SELECT true FROM heat WHERE heat_number = NEW.charass_value) THEN
INSERT INTO heat (heat_number,heat_created,heat_vend_id)
SELECT NEW.charass_value,NOW(), order_vend_id
FROM ls
JOIN detail ON (ls_id = detail_ls_id)
JOIN hist ON (detail_hist_id = hist_id)
JOIN order ON (hist_order_id = order_id)
WHERE hist_ordtype = 'PO' AND hist_transtype = 'RP' AND ls_id = NEW.charass_target_id;
END IF;
END IF;
RETURN NEW;
END;
$BODY$;
当我查看日志文件时。我可以看到执行的语句
statement: INSERT INTO charass (charass_value, charass_target_type, charass_target_id, charass_char_id) VALUES ('123456789', 'LS', 1234, 34)
我查看热度 table 希望看到 heat_number 为“123456789”的记录,但热度 table 中没有任何内容。
于是我打开 pg admin 并复制上面的语句并手动执行它。现在热火有记录table。
手动插入和应用程序插入有什么区别。有办法告诉吗?声明后面的用户名是相同的,所以它不能是许可的事情。我想知道是否有某种方法可以将信息从触发器函数发送到日志文件,以便我查看它
将 auto_explain
添加到 postgresql.conf
中的 shared_preload_libraries
以及这些附加参数:
auto_explain.log_nested_statements = on
auto_explain.log_min_duration = 0
然后重启 PostgreSQL。
现在您将记录函数内的语句及其执行计划。