[pgsql-jp: 32979] Re: NEW もしくは OLD に別名を与える方法は?

Jun Kitamura kitamura @ zoozee.jp
2004年 5月 20日 (木) 20:52:08 JST


北村です。

> 藤井です
> 
> 北村さん、またまたサポートして頂きありがとうございます。

いえいえ。お役に立てませんで・・。

> > SELECT NEW.* into rec;
> > で出来ませんか?
(略)
> 以下のように記述して、早速試してみました。
> DECLARE
>     rec  RECORD ;
> BEGIN
>     SELECT NEW.* INTO rec ;
> 
> 結果はやはりエラーでした。
> エラーは以下のとおりです。
> WARNING:  Error occurred while executing PL/pgSQL function func_name
> WARNING:  line n at select into variables
> SQL実行中に以下のエラーが発生しました。
> ERROR:  NEW used in non-rule query

select NEW.* という行為がダメみたいですね。
カラムをひとつずつ入れてやる方法はOKみたいなんですが、こんな
ことするなら、NEW か OLD で分けたほうが早いですねw。
例
create table tpoi(a int4, b int4);

create or replace function fpoi() returns TRIGGER as
'
 DECLARE
  rec RECORD;
 BEGIN
  -- rec を型にはめる
  select * into rec from tpoi where false;
  -- ひとつずつ入れる
  -- select NEW.* into rec; や rec := NEW; はダメみたい
  rec.a := NEW.a;
  rec.b := NEW.b;
  -- 以下何かの処理
  RETURN NEW;
 END;
'
language 'plpgsql'
SECURITY DEFINER;

create trigger poi
 before INSERT on tpoi for each row
 execute procedure fpoi();

> #今回は、OLD用INSERT文とNEW用INSERT文を記述することで
>  この問題を回避しました。

これが正当な方法な気がします(いまさらながらw)。

失礼しました。




pgsql-jp メーリングリストの案内