Thread: обновляющий тригер

обновляющий тригер

From
Genix
Date:
Приветствую!

Подскажите пожалуйста, как правильнее создать триггер, который обновляет
некоторые поля обновленной или вставленной записи?

т.е., например, в таблице, должно быть поле birth_year =
YEAR(birth_date), и при вставки/обновлении записи в таблице, это
значение должно заполняться.


P.$.: в  информиксе это делалось таким образом:

CREATE TRIGGER trg_ins_sbj_1
INSERT ON persons
REFERENCING NEW AS new
FOR EACH ROW (
execute procedure my_proc(new.name, new.birth_date)
into table.name_upper,table.birth_year);

где функция my_proc возвращала несколько значений (upper для name, year
для даты).


Заранее спасибо!

--
У каждого в башке свои тараканы...

Re: обновляющи

From
"Viktor Vislobokov"
Date:
А почему бы не сделать вставку DEFAULT без триггера?
Например как описано здесь:
http://www.linuxshare.ru/postgresql/manual/ddl-default.html

после DEFAULT вызывать твою функцию YEAR(birth_date)

> Приветствую!
>
> Подскажите пожалуйста, как правильнее создать триггер, который
> обновляет некоторые поля обновленной или вставленной записи?
>
> т.е., например, в таблице, должно быть поле birth_year =
> YEAR(birth_date), и при вставки/обновлении записи в таблице, это
> значение должно заполняться.
>
>
> P.$.: в  информиксе это делалось таким образом:
>
> CREATE TRIGGER trg_ins_sbj_1
> INSERT ON persons
> REFERENCING NEW AS new
> FOR EACH ROW (
> execute procedure my_proc(new.name, new.birth_date)
> into table.name_upper,table.birth_year);
>
> где функция my_proc возвращала несколько значений (upper для name,
> year для даты).
>
>
> Заранее спасибо!
>


--
С уважением, Виктор



Re: обновляющи

From
Андрей Зевакин
Date:
Genix пишет:

> Приветствую!
>
> Подскажите пожалуйста, как правильнее создать триггер, который
> обновляет некоторые поля обновленной или вставленной записи?
>
> т.е., например, в таблице, должно быть поле birth_year =
> YEAR(birth_date), и при вставки/обновлении записи в таблице, это
> значение должно заполняться.
>
я бы сделал вот так
CREATE TABLE persons
(
  name varchar,
  birth_date date,
  name_upper varchar,
  birth_year int4
) ;

CREATE FUNCTION check_person_trigger_function() RETURNS "trigger" AS '
begin
  if new.name is not null then
    new.name_upper := upper(new.name);
  end if;

  if new.birth_date is not null then
    new.birth_year := extract(year from new.birth_date);
  end if;

  return new;
end;
' LANGUAGE 'plpgsql' VOLATILE;

CREATE TRIGGER check_persons_trigger BEFORE INSERT OR UPDATE
   ON persons FOR EACH ROW
   EXECUTE PROCEDURE public.check_person_trigger_function();

insert into persons (name, birth_date) values ('Юра', '10.10.1970');
select * from persons;

update persons set name = 'Юрий', birth_date = '10.10.1971';
select * from persons;


Re: обновляющи

From
Genix
Date:
Viktor Vislobokov wrote:
> А почему бы не сделать вставку DEFAULT без триггера?
> Например как описано здесь:
> http://www.linuxshare.ru/postgresql/manual/ddl-default.html
>
> после DEFAULT вызывать твою функцию YEAR(birth_date)

а при update'е оно сработает?
или я не понял идеи?

--
У каждого в башке свои тараканы...

Re: обновляющи

From
Genix
Date:
Андрей Зевакин wrote:


> я бы сделал вот так

именно то что надо!!!!!!!!!!
огромное спасибо!

--
У каждого в башке свои тараканы...