首页 > 解决方案 > 使用 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”的编译

当某些用户对表没有权限时,我需要捕获并处理此警告。

标签: postgresqlexceptionerror-handlingwarningsplpgsql

解决方案


你真的无法捕捉到警告——没有任何机制可以做到这一点。例外是不同的生物。错误信息是干净的,你可以尝试一些不是异常的。可用例外的名称(和代码)在此列表中

您可以通过以下步骤找到应该捕获的异常:

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 之前提到的)


推荐阅读