0

トリガーを使用して、属性に非 null 制約を実装したいと考えています。これが私のコードです:

create table mytable2(id int);

create or replace function p_fn() returns trigger as $prim_key$
begin
  if (tg_op='insert') then
    if (id is null) then
      raise notice 'ID cannot be null';
      return null;
    end if;
    return new;
  end if;
end;
$prim_key$ language plpgsql;

create trigger prim_key
before insert on mytable2
for each row execute procedure p_fn();

しかし、null 値を挿入しようとすると、「コントロールが RETURN なしでトリガー プロシージャの最後に到達しました」というエラーが表示されます。内部IFに「return new」ステートメントを配置しようとしましたが、それでも同じエラーが発生しました。私は何を間違っていますか?

4

2 に答える 2

2

この問題の直接の原因は、PostgreSQL の文字列比較で大文字と小文字が区別されることです。INSERTと同じではありませんinsert。試す:

IF tg_op = 'INSERT' THEN

アドバイス

あなたは通知を上げているだけです。これにより、制御の流れをプロシージャの次の行に続行できます。通常RAISE EXCEPTION、実行を中止してトランザクションをロールバックする必要があります。を参照してくださいRAISE。現状では、トリガーは、要件を満たさない挿入を静かに失敗させますが、これは通常、必要なものではありません。

さらに、トリガーは通常RAISE EXCEPTION、関数の終了前に常に戻ることになっている場合に終了する必要があります。そうすることで、何が問題なのかをより早く知ることができたでしょう。

于 2013-04-14T10:47:06.340 に答える