Postgresql签入列表约束的自定义错误消息

Postgresql签入列表约束的自定义错误消息,postgresql,function,triggers,check-constraints,custom-error-handling,Postgresql,Function,Triggers,Check Constraints,Custom Error Handling,我想为Postgres签入违规创建一个更具体的错误消息。例如,违反列上的以下检查约束: management_zone varchar(15) NOT NULL CHECK (management_zone IN ('Marine', 'Terrestrial') ), 应返回自定义错误消息,如ie:“提示:检查拼写。只允许输入:'海洋','陆地' 到目前为止,我看到的最好的解决方案是使用错误消息作为检查约束的名称,即 ADD CONSTRAINT c_managementzone_@Chec

我想为Postgres签入违规创建一个更具体的错误消息。例如,违反列上的以下检查约束:

management_zone varchar(15) NOT NULL CHECK (management_zone IN ('Marine', 'Terrestrial') ),
应返回自定义错误消息,如ie:“提示:检查拼写。只允许输入:'海洋','陆地'

到目前为止,我看到的最好的解决方案是使用错误消息作为检查约束的名称,即

ADD CONSTRAINT c_managementzone_@Check_spelling._Only_allowed_inputs_are:_'Marine',_'Terrestrial' CHECK (management_zone IN ('Marine', 'Terrestrial') ),
然后应用一个函数,通过用空格替换下划线来修复@符号后的错误消息,使其更可读。然后使用try-and-catch语句调用该函数

然而,这段代码是在我不熟悉的t-sql中编写的,我也不知道有多少PL/pgSQL可以转换和复制它。因此,我想知道是否有人可以建议如何在postgres中完成类似的操作,例如使用函数和触发器

t-sql代码和解释可从此处获得,我将其复制粘贴到下面:

试一试:

BEGIN TRY
INSERT  dbo.Book
        ( BookId, WritingDate, publishDate )
VALUES  ( 1, GETDATE(), GETDATE() + 1 )
END TRY
BEGIN CATCH

DECLARE @Msg NVARCHAR(4000) = dbo.ufnGetClearErrorMessage2();
THROW 60001, @Msg, 1;
END CATCH

任何值得赞赏的建议。

如果您可以接受稍微不同的检查约束,您可以执行以下操作:

创建一个检查值的函数:

create function check_zone(p_input text)
  returns boolean
as
$$
declare
  l_allowed text[] := array['Marine', 'Terrestrial'];
begin
  if p_input = any(l_allowed) then 
    return true;
  end if;
  raise 'The only allowed values are: %', array_to_string(l_allowed, ', ');
end;
$$
language plpgsql
immutable;
然后使用该函数,而不是在以下条件下使用:

create table data
(
  management_zone text not null,
  CONSTRAINT check_zone CHECK (check_zone(management_zone))
);
插入以下内容:

insert into data values ('foo');
将导致:

错误:唯一允许的值是:海洋、陆地


这不起作用。约束名称超过63个字符,因此将被截断。您将收到一条警告,如:
标识符“c_managementzone”检查拼写。仅允许的输入为:“'Marine','Terral'”将被截断为“c_managementzone”检查拼写。仅允许的输入为:“'Mar”“
啊,好的。该死!谢谢你的信息。
insert into data values ('foo');