Thread: обновляющий тригер
Приветствую! Подскажите пожалуйста, как правильнее создать триггер, который обновляет некоторые поля обновленной или вставленной записи? т.е., например, в таблице, должно быть поле 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 для даты). Заранее спасибо! -- У каждого в башке свои тараканы...
А почему бы не сделать вставку 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 для даты). > > > Заранее спасибо! > -- С уважением, Виктор
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;
Viktor Vislobokov wrote: > А почему бы не сделать вставку DEFAULT без триггера? > Например как описано здесь: > http://www.linuxshare.ru/postgresql/manual/ddl-default.html > > после DEFAULT вызывать твою функцию YEAR(birth_date) а при update'е оно сработает? или я не понял идеи? -- У каждого в башке свои тараканы...
Андрей Зевакин wrote: > я бы сделал вот так именно то что надо!!!!!!!!!! огромное спасибо! -- У каждого в башке свои тараканы...