gpt4 book ai didi

postgresql - PGSQL 触发器函数将异常写入日志表

转载 作者:行者123 更新时间:2023-11-29 12:51:13 25 4
gpt4 key购买 nike

背景

我是 PostgreSQL 的新手,我在使用这个触发函数时遇到了一些问题,我在下面明显简化了这些问题。我可以要求帮助修复查询,但我认为我可以处理,而且我更关心的是我有很多这样的功能,我需要一种方法来了解它失败的原因,以及哪些失败了。

问题

我如何捕获此函数中发生的异常并将它们写入某种日志表以便我可以查看和修复每个异常?理想情况下,我也想将失败的 sql 语句写入日志表,以便我可以具体查看出了什么问题。我见过几个类似的例子,但它们似乎不符合我的场景。

CREATE OR REPLACE FUNCTION my_func() RETURNS TRIGGER AS $$
BEGIN
IF (TG_OP = 'INSERT') THEN

INSERT INTO my_table(...)
SELECT ...
FROM table_1 t1
JOIN table_2 t2 ON t1.id = t2.id
ON CONFLICT (id)
DO UPDATE
field1 = EXCLUDED.field1;

ELSIF(TG_OP = 'UPDATE') THEN

UPDATE my_table
SET ...
FROM table_1 t1
JOIN table_2 t2 ON t1.id = t2.id
WHERE id = NEW.id;

ELSIF (TG_OP = 'DELETE') THEN
DELETE FROM my_table WHERE id= OLD.id;
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;

最佳答案

这是一个示例,使用的是普通函数而不是触发器,尽管就如何记录而言它们实际上是同一回事:

存储错误的表格:

CREATE TABLE errors (id SERIAL, sql_state TEXT, message TEXT, detail TEXT, hint TEXT, context TEXT);

确实有效并具有异常处理/日志记录的函数:

CREATE OR REPLACE FUNCTION my_func()
RETURNS VOID AS
$BODY$
DECLARE
_sql_state TEXT;
_message TEXT;
_detail TEXT;
_hint TEXT;
_context TEXT;
BEGIN
PERFORM 1 / 0;
EXCEPTION
WHEN OTHERS THEN
GET STACKED DIAGNOSTICS
_sql_state := RETURNED_SQLSTATE,
_message := MESSAGE_TEXT,
_detail := PG_EXCEPTION_DETAIL,
_hint := PG_EXCEPTION_HINT,
_context := PG_EXCEPTION_CONTEXT;

INSERT INTO errors (sql_state, message, detail, hint, context)
VALUES (_sql_state, _message, _detail, _hint, _context);
END
$BODY$
LANGUAGE plpgsql;

调用函数后,errors 表包含:

enter image description here

参见 https://rextester.com/BQPG27732

上下文显示了各种调用堆栈。当然,您可以添加更多与错误相关的字段,我只选择了GET STACKED DIAGNOSTICS

中可用的少数字段

关于postgresql - PGSQL 触发器函数将异常写入日志表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53504234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com