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

扳机

create trigger msgfail before insert on first for each row 
execute procedure msgfailerror()

给出错误:

“cannot”处或附近的语法错误 LINE 5: RAISE EXCEPTION 'cannot have a negative ...

我对行的每个字段都有几乎一个验证。我想在插入完成时触发检查所有验证,然后一劳永逸地引发错误日志。我应该在 raise notice 上使用 raise exception 吗?

例如:

Insert into first (first_column, noces,dob) values ('4545','75','545') 

我正在检查noces小于first_column,对于同一行,我想检查 dob > 80 以及 first_column 是否为整数并为所有验证引发错误。提前致谢

4

3 回答 3

34

引用是错误的。使用美元引号 $$ 更容易:

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;

但另一方面,检查约束有什么问题?

于 2012-09-21T10:58:45.390 回答
4

你没有错,唯一的问题是使用引号

请更换 :

RAISE EXCEPTION 'cannot have a negative salary';

到:

RAISE EXCEPTION ''cannot have a negative salary'';

'' 不同于 "

'' = 两个单引号

于 2017-05-23T09:02:49.943 回答
1

我同意弗兰克的观点,你可以更好地使用约束,但你称之为验证。验证通常在插入发生之前完成。如果您想验证插入,您可以使用函数而不是触发器或约束。

何时编写函数是您提出异常或通知的问题的答案,只要没有写入操作,通知就足够了(连同离开函数)。一旦对数据库进行了写入,您是否必须在执行回滚时使用异常。

像这样:

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;
于 2012-09-26T19:51:04.333 回答