postgresql - Postgres 触发器无法插入包含数字或特殊字符的值

标签 postgresql database-trigger

我想就我的职能向您寻求帮助。我想在插入之前触发。如果有人想插入包含数字或特殊字符的名称,它将无法插入。有效值只能包含 a-zA-Z 字母。

CREATE OR REPLACE FUNCTION fnc_control_value()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $function$
BEGIN
   IF NEW.name LIKE ‘%[a-zA-Z]%’ and NEW.surname LIKE‘%[a-zA-Z]%’ THEN 
   return new;
ELSE
   RAISE WARNING ‘INVALID CHARACTERS IN ENTERING VALUE';
   Return null;
END IF;
END;
$function$;

最佳答案

LIKE 支持的唯一通配符是 % 形成多个字符和 _ 形成单个字符。

Quote from the manual

If pattern does not contain percent signs or underscores, then the pattern only represents the string itself; in that case LIKE acts like the equals operator. An underscore (_) in pattern stands for (matches) any single character; a percent sign (%) matches any sequence of zero or more characters.

所以,LIKE '%[a-zA-Z]%' 简单的意思是:在某处包含字符串 [a-zA-z] 的任何值

例如,下面的查询:

select 'foobar' LIKE '%[a-zA-Z]%' as one,
       'this [a-zA-Z] matches' LIKE '%[a-zA-Z]%' as two;

返回

one   | two 
------+-----
false | true

如果你想匹配 regular expression , 你需要使用 ~SIMILAR TO:

CREATE OR REPLACE FUNCTION fnc_control_value()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $function$
BEGIN
   IF NEW.name ~ '^[a-zA-Z]*$' and NEW.surname ~ '^[a-zA-Z]*$' THEN 
     return new;
   ELSE
     RAISE WARNING 'INVALID CHARACTERS IN ENTERING VALUE';
     Return null;
   END IF;
END;
$function$;

而是静静地(!)忽略插入或更新,我会抛出一个异常,该异常将显示为执行插入的 session 的错误:

CREATE OR REPLACE FUNCTION fnc_control_value()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $function$
BEGIN
   IF NEW.name ~ '^[a-zA-Z]*$' and NEW.surname ~ '^[a-zA-Z]*$' THEN 
     return new;
   ELSE
     RAISE 'Only characters from A to Z allowed!';
   END IF;
END;
$function$;

请注意,您必须在 BEFORE 触发器中使用它,否则它不起作用。

create trigger ugly_check_constraint_trigger()
    BEFORE insert or update on the_table
    for each row 
    execute procedure fnc_control_value();

但同样:最好使用检查约束来完成。

关于postgresql - Postgres 触发器无法插入包含数字或特殊字符的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48428484/

相关文章:

postgresql - sql : how to select a row with a true value from a column of boolean values after the HAVING clause

spring - 使用 PostgresQL 和 H2 的 Liquibase 脚本

mysql - 是否可以在MySql触发器中将表名导出为 "NEW.<TABLE FEILD>"?

sqlite - 使用触发器在SQlite中插入多行

MySQL触发不同数据库不同服务器

postgresql - 仅将更新的行发送给客户端

sql - 有没有办法在 SQL 中找到活跃用户?

mysql - 我可以允许用户仅使用他的数据更改表吗?

sql - PostgreSQL继承表和插入触发器

postgresql - 如何在 CentOS 上运行 pg_ctlcluster?