Обсуждение: Altering field passed as parameter to plpgsql trigger

Поиск
Список
Период
Сортировка

Altering field passed as parameter to plpgsql trigger

От
Steve Crawford
Дата:
I am trying to make a function that can be reused as a trigger on
various tables but am somehow not finding the correct syntax for using a
parameter to the function to identify the column to be altered by the
trigger. Stripped to basics:

create or replace function foo_trigger()
returns trigger
as '
declare
  ...
begin
  trigger_table = TG_ARGV[0];
  field_to_alter = TG_ARGV[1];
  ...
  new.field_to_alter = some_computed_value;  <<==========
  return new;
end;'
language 'plpgsql';

create trigger foo_change before insert on foo
  for each row execute procedure foo_trigger('foo','somealteredfield');

What is the correct syntax for the line:
new.field_to_alter = some_computed_value;

Also, does plpgsql have a preferred way to identify the table that fired
the trigger. I see the syntax for C but not for plpgsql.

Cheers,
Steve


Re: Altering field passed as parameter to plpgsql trigger

От
Richard Huxton
Дата:
Steve Crawford wrote:

> What is the correct syntax for the line:
> new.field_to_alter = some_computed_value;

Can't be done in plpgsql - it's too static a language. On first call,
that assignments basically gets compiled into a planned query and from
then on you're stuck.

You can use pl/tcl or pl/perl etc. since they're more dynamic.

> Also, does plpgsql have a preferred way to identify the table that fired
> the trigger. I see the syntax for C but not for plpgsql.

TG_RELNAME / TG_TABLE_NAME - it's in the plpgsql/triggers section of the
manual.

--
   Richard Huxton
   Archonet Ltd

Re: Altering field passed as parameter to plpgsql trigger

От
Steve Crawford
Дата:
Richard Huxton wrote:
> Steve Crawford wrote:
>
>> What is the correct syntax for the line:
>> new.field_to_alter = some_computed_value;
>
> Can't be done in plpgsql - it's too static a language. On first call,
> that assignments basically gets compiled into a planned query and from
> then on you're stuck.
>
> You can use pl/tcl or pl/perl etc. since they're more dynamic.
Great. I'll use another approach.

>> Also, does plpgsql have a preferred way to identify the table that
>> fired the trigger. I see the syntax for C but not for plpgsql.
>
> TG_RELNAME / TG_TABLE_NAME - it's in the plpgsql/triggers section of
> the manual.
>
Thanks. I did find that after another cup of coffee. :)

Cheers,
Steve