Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Натравить триггер на несколько таблиц


Автор: Royan 26.12.2007, 17:56
Я тут занялся созданием авто инкрементируемого ключа, а поскольку в оракле самое простое - это сделать его через триггер, то возник вопрос, можно ли этот триггер натравить сразу на несколько табличек?

Вот код, который я подсмотрел по созданию авто инкремента:
Код

create sequence auto_inc_seq
start with 1
increment by 1
nomaxvalue;

create trigger auto_inc_tasks before insert on running_tasks
for each row
begin
     select auto_inc.nextval into :new.id from dual;
end;


Хотелось бы в строке "create trigger auto_inc_tasks before insert on running_tasks" перечислить все таблички, на которые я хочу повесить триггер, а не только running_tasks

Автор: ivashkanet 26.12.2007, 18:21
Royan, в тригерах не силен. Беглый осмотр документации показал, что тригер вешается только на одно событие (поэтому на одну таблицу).

Есть предложение использовать N тригеров (по каждому на таблицу) которые используют один сквенс (auto_inc_seq).
Тогда ID-шники всех таблиц будут уникальны (если ты этого хочешь).

Автор: Deniel_li 26.12.2007, 18:49
А можите сказать, как происходит добавление данных в таблицы? С помощью процедур или просто инсертом?

Автор: Royan 26.12.2007, 21:19
ivashkanet, Да, ты прав, я в нескольких источниках наткнулся на тоже самое.


Deniel_li, 
Можно и так и так, все это довольно просто находится в гугле по запросу вроде "oracle create triggers"

Автор: LSD 27.12.2007, 00:15
Цитата(Royan @  26.12.2007,  17:56 Найти цитируемый пост)
поскольку в оракле самое простое - это сделать его через триггер

По мне так самое простое - это проставить умолчальное значение поля в sys_guid() smile

Автор: ivashkanet 27.12.2007, 09:44
LSD, ИМХО, гуид жрет много ресурсов + по нему индекс тяжелее строиться
Хотя это действительно проще некуда.

Автор: LSD 27.12.2007, 11:40
Мне нравится GUID тем что:
- он уникален по всем таблицам и базам
- если данные надо передавать в другую БД, то с ним не будет проблем, он может аналогично генерироваться в другой СУБД (в отличии от сиквенсов и автоинкрементов)

Автор: Royan 27.12.2007, 13:58
Цитата(ivashkanet @  26.12.2007,  15:21 Найти цитируемый пост)
Беглый осмотр документации показал, что тригер вешается только на одно событие (поэтому на одну таблицу)

Выяснял, что это не совсем так. С помощью инструкций INSERTING, UPDATING, DELETING можно создать триггер, который бы реагировал на действия связанные со всеми этими операциями 

Пример:

Код

CREATE OR REPLACE TRIGGER statement_level
AFTER INSERT OR UPDATE OR DELETE
ON orders
BEGIN
  IF INSERTING THEN
    INSERT INTO event_log (event_desc) VALUES ('Order added')
  ELSIF UPDATING THEN
    INSERT INTO event_log (event_desc) VALUES ('Order updated')
  ELSIF DELETING THEN
    INSERT INTO event_log (event_desc) VALUES ('Order deleted')
  END IF;
END statement_level;


Триггер дернется при всех INSERT'ах, UPDATE'ах и DELETE'ах, выполненных на таблице orders

Автор: Deniel_li 27.12.2007, 14:01
Если вынести инсерты в таблицы процедуры, то можно вообще отказаться от тригеров, а создать функцию вроде такой (сорри за возможные ошибки, проверить сейчас негде)
Код

create or replace function fu_new_id return number
as
  result number;
begin
  select auto_inc.nextval into result from dual;
  return  result;
end;

и использовать эту функцию в процедурах (можно и в инсертах) для генерации следующего ид.
Помоему это проще всего.


Автор: ivashkanet 27.12.2007, 14:46
Royan, прикольно  smile 

Только вот таблица все равно остается только одна, а наличее такого рода ифов в тригере мне, мягко говоря, не нравиться. Уж лучше три тригера иметь на каждый тип изменения.

Автор: DimW 27.12.2007, 15:10
Цитата(ivashkanet @  27.12.2007,  14:46 Найти цитируемый пост)
Уж лучше три тригера иметь на каждый тип изменения. 

а иногда лучше иметь 3 триггера на один тип изменения smile

все зависит от конкретной задачи.

Автор: behelit_ru 12.2.2008, 23:47
Тут на помощь могут прийти понятия "структурное программирование", "модульность".

Нужно написать функцию, которая выбирает значение из последовательности и возвращает его...
а потом для таблиц написать одинаковые триггеры, которые вызывают эту функцию (в случае чего нужно будет править только одну функцию, а не кучу триггеров).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)