CREATE OR REPLACE FUNCTION msgfailerror() RETURNS trigger AS
' BEGIN
IF NEW.noces< new.first_column THEN
RAISE EXCEPTION 'cannot have a negative salary';
END IF;
return new;
END' LANGUAGE plpgsql
触发
create trigger msgfail before insert on first for each row
execute procedure msgfailerror()
给出错误:
语法错误处于或接近“不能”LINE 5:RAISE EXCEPTION'不能有负面的......
我对每个行字段进行了几乎一次验证。我希望触发器在插入完成时检查所有验证,然后一次性提高错误日志。我应该在加注通知时使用加注例外吗?
例如:
Insert into first (first_column, noces,dob) values ('4545','75','545')
我正在检查noces
是否小于first_column
,对于同一行我想检查dob&gt; 80并且first_column是整数并且为所有验证引发错误。提前致谢
答案 0 :(得分:17)
引用错误。使用美元报价$$:
更容易CREATE OR REPLACE FUNCTION msgfailerror()
RETURNS trigger AS
$$
BEGIN
IF NEW.noces< new.first_column THEN
RAISE EXCEPTION 'cannot have a negative salary';
END IF;
return new;
END;
$$
LANGUAGE plpgsql;
但另一方面,检查约束有什么问题?
答案 1 :(得分:1)
我同意Frank你可以更好地使用约束,但你称之为验证。验证通常在插入之前完成。如果您想验证插入,可以使用函数而不是触发器或约束。
当您编写函数时,您的问题的答案是提出异常或通知,只要没有写入操作,通知就足够了(与离开函数一起)。一旦写入数据库,您是否必须在执行回滚时使用异常。
像这样:
CREATE OR REPLACE FUNCTION field_validate(p_int int) RETURNS boolean AS $$
DECLARE
i_id int;
BEGIN
if p_int > 10 then
raise notice 'should be smaller then 10';
return false;
end if;
insert into tbl_numbers(firstfield) values(p_int) returning id in i_id;
insert into tbl_fake(nofield) values(i_id);
return true;
EXCEPTION
WHEN raise exception THEN
return false;
END;
$$ LANGUAGE plpgsql;
答案 2 :(得分:0)
你唯一没有问题是使用引号
请改变:
RAISE EXCEPTION 'cannot have a negative salary';
为:
RAISE EXCEPTION ''cannot have a negative salary'';
&#39;&#39;与&#34;
不同&#39;&#39; =两个单引号