Postgres 触发器无法插入包含数字或特殊字符的值
Postgres trigger cannot insert value which contains a number or special char
我想就我的职能向您寻求帮助。我想在 insert.If 有人想要插入包含数字或特殊字符的名称之前触发触发器,它将无法插入。有效值只能包含 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
支持的唯一通配符是 %
形成多个字符和 _
形成单个字符。
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;
returns
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$;
而是静静地 (!) 忽略插入或更新,我会抛出一个异常,该异常将显示为执行插入的会话的错误:
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();
但同样:最好使用检查约束来完成。
我想就我的职能向您寻求帮助。我想在 insert.If 有人想要插入包含数字或特殊字符的名称之前触发触发器,它将无法插入。有效值只能包含 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
支持的唯一通配符是 %
形成多个字符和 _
形成单个字符。
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;
returns
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$;
而是静静地 (!) 忽略插入或更新,我会抛出一个异常,该异常将显示为执行插入的会话的错误:
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();
但同样:最好使用检查约束来完成。