postgresql - 使用 plpgsql 捕获警告
问题描述
我正在尝试处理警告,但我在文档中读到您无法在 plpgsql 中执行此操作。
CREATE OR REPLACE FUNCTION update_team(person varchar(50), id_team integer, long varchar(50), short varchar(25)) RETURNS VOID AS $$
BEGIN
PERFORM * FROM team WHERE id = id_team;
IF FOUND THEN
UPDATE team SET long_name = long WHERE id = id_team;
UPDATE team SET short_name = short WHERE id = id_team;
RAISE INFO 'Team update.';
ELSE
RAISE INFO 'Cannot find team id';
END IF;
EXCEPTION
WHEN privilege_not_granted THEN
RAISE INFO 'Cannot do that';
END;
$$ LANGUAGE plpgsql;
当然,它不起作用。我得到错误:
错误:错误:无法识别的异常条件“privilege_not_granted” 上下文:第 12 行附近的 PL/pgSQL 函数“update_team”的编译
当某些用户对表没有权限时,我需要捕获并处理此警告。
解决方案
你真的无法捕捉到警告——没有任何机制可以做到这一点。例外是不同的生物。错误信息是干净的,你可以尝试一些不是异常的。可用例外的名称(和代码)在此列表中。
您可以通过以下步骤找到应该捕获的异常:
postgres=# create role student login;
CREATE ROLE
postgres=# create table foo(a int);
CREATE TABLE
postgres=# set role to student;
SET
postgres=> \set VERBOSITY verbose
postgres=> update foo set a = 20;
ERROR: 42501: permission denied for table foo
LOCATION: aclcheck_error, aclchk.c:3487
因此,您应该使用 code 处理异常42501
,并且在提到的带有异常列表的文档中,您可以找到一个名称insufficient_privilege
(@nick-barnes 之前提到的)
推荐阅读
- django - Recombee 批处理不发送所有数据
- php - NGINX 默认站点工作,但另一个端口上的一个不工作
- java - 如何正确访问 ArrayList 以在 HashMap Java 中进行迭代?
- tensorflow.js - 如何定义具有数千个可能分类值的输入张量?
- java - 套接字连接程序(TCP/IP)适用于 localhost/common 网络但不适用于其他 IP
- android - 如何使用过时的 android sdk 版本
- python - pygame.draw.rect 无法处理元组中的值和整数之间的操作,但任何其他函数都可以
- xpath - XPath:匹配两个相似标签之间的文本
- java - 在每一行上打印一个 * 作为输出
- node.js - node - 我们是否需要在 require() 中使用 path.join() 以实现 Windows 兼容性?