使用 plpgsql 捕获警告

Catch a warning using 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;

当然它不起作用。我收到错误:

Error: ERROR: unrecognized exception condition "privilege_not_granted" CONTEXT: compilation of PL/pgSQL function "update_team" near line 12

当某些用户没有 table.

权限时,我需要捕获并处理此警告

您真的无法捕获警告 - 没有任何机制可以做到这一点。例外是不同的生物。错误信息很清楚,你可以尝试一些没有异常的东西。可用异常的名称(和代码)在此 list.

你应该捕获什么异常可以通过以下步骤找到:

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

所以你应该用代码 42501 来处理异常,在提到的异常列表文档中你可以找到一个名称 insufficient_privilege(@nick-barnes 之前提到的)