【问题标题】:Exception handling postgresql异常处理 postgresql
【发布时间】:2018-11-19 20:46:50
【问题描述】:

各位程序员们好,

我有一个关于异常处理的问题。 我创建了一个函数,用于将值插入到包含电子邮件和用户名列的表中,电子邮件的最大字符长度为 16,密码的最大字符长度为 32。

现在,每当插入的电子邮件超过 16 个字符时,我想发出一条错误消息,例如“密码太长,最多 16 个字符”。

我已经尝试过使用“Name_too_long”错误代码。

如何在 Postgres 10.5 中遇到异常? 提前致谢。

编辑:半功能代码

    CREATE OR REPLACE FUNCTION users_insert(_email character varying,_passwort character varying) RETURNS void 
    AS $BODY$
     BEGIN 
     INSERT INTO users(email,passwort,lastlogin)
     VALUES(_email,_passwort,CURRENT_TIMESTAMP);
     EXCEPTION 
     WHEN string_data_right_truncation 
     THEN RAISE NOTICE 'ERROR: INSERT TOO LONG';
     END;
    $BODY$
    LANGUAGE plpgsql ;

编辑:工作代码,每个错误都有 2 条不同的错误消息:

CREATE OR REPLACE FUNCTION public.users_insert(
    _email character varying,
    _passwort character varying)
    RETURNS void
    LANGUAGE 'plpgsql'

    COST 100
    VOLATILE 
AS $BODY$

 BEGIN 
 IF LENGTH(_passwort) > 16
  THEN RAISE EXCEPTION USING errcode = 50001;
END IF;

 IF LENGTH(_email) > 32
  THEN RAISE EXCEPTION USING errcode = 22001;
  END IF;


 INSERT INTO users(email,passwort,lastlogin)
 VALUES(_email,_passwort,CURRENT_TIMESTAMP);

EXCEPTION 
 WHEN SQLSTATE '50001' THEN  
   RAISE NOTICE 'Password too long, 16 Chars max';

WHEN SQLSTATE '22001' THEN  
   RAISE NOTICE 'Email too long, 32 Chars max';


 END; 

$BODY$;

ALTER FUNCTION public.users_insert(character varying, character varying)
    OWNER TO postgres; 

【问题讨论】:

  • 您可能对Security.SE quoestion Should I have a maximum password length? 感兴趣
  • @KaushikNayak 我已将代码编辑到我的帖子中。我现在的问题是,它给出了一个错误,但我不能在两个不同的错误之间“选择”。我正在尝试获取一个用于太长的密码插入和一个用于太长的电子邮件插入。我想为每个错误创建一个不同的消息。

标签: postgresql exception exception-handling


【解决方案1】:

使用IF 条件检查特定列的长度并引发/处理相关异常。

CREATE OR REPLACE FUNCTION users_insert(_email character varying,
                                        _passwort character varying ) 
RETURNS void 
 AS $BODY$
  BEGIN 

  IF LENGTH(_passwort) > 16
    THEN RAISE EXCEPTION  USING errcode = 50001;
  END IF;

  INSERT INTO users(email,passwort,lastlogin)
    VALUES(_email,_passwort,CURRENT_TIMESTAMP);

  EXCEPTION 
   WHEN SQLSTATE '50001' THEN
       RAISE NOTICE  'Password too long,16 Chars max';
   WHEN OTHERS THEN
    raise notice '% %', SQLERRM, SQLSTATE;
 END;
$BODY$
LANGUAGE plpgsql ;

测试

knayak$# PERFORM users_insert('username2251621819101010@mail.com','password123passwod');
knayak$#
knayak$# END $$;
NOTICE:  Password too long,16 Chars max
DO
knayak=# DO $$
knayak$# BEGIN
knayak$#
knayak$# PERFORM users_insert('username2251621819101010@mail.com','password');
knayak$#
knayak$# END $$;
NOTICE:  value too long for type character varying(30) 22001
DO

【讨论】:

  • 非常感谢,这就是我一直在寻找的答案,我自己未能创建 If 条件,由于一个小的语法错误,我无法弄清楚!
猜你喜欢
  • 2011-06-20
  • 1970-01-01
  • 2015-04-10
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多