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 ...

行の各フィールドに対してほぼ1つの検証があります。挿入が行われている間にすべての検証をチェックするトリガーが必要であり、その後エラーログを一度だけ発生させます。レイズ通知でレイズ例外を使用する必要がありますか?

例えば:

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

同じ行について、 dob > 80 であるかどうか、および first_column が整数であるかどうかを確認し、すべての検証でエラーを発生させnocesます。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 に答える
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 に答える