Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Натравить триггер на несколько таблиц 
V
    Опции темы
Royan
  Дата 26.12.2007, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: 1
Всего: 15



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

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

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


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
ivashkanet
Дата 26.12.2007, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: нет
Всего: 149



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

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

PM MAIL WWW ICQ   Вверх
Deniel_li
Дата 26.12.2007, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 6.12.2007

Репутация: нет
Всего: 1



А можите сказать, как происходит добавление данных в таблицы? С помощью процедур или просто инсертом?
PM MAIL   Вверх
Royan
Дата 26.12.2007, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: 1
Всего: 15



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


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

Это сообщение отредактировал(а) Royan - 26.12.2007, 21:20


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
LSD
Дата 27.12.2007, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



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

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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
ivashkanet
Дата 27.12.2007, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: нет
Всего: 149



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

Это сообщение отредактировал(а) ivashkanet - 27.12.2007, 09:44
PM MAIL WWW ICQ   Вверх
LSD
Дата 27.12.2007, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Royan
  Дата 27.12.2007, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: 1
Всего: 15



Цитата(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



--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
Deniel_li
Дата 27.12.2007, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 6.12.2007

Репутация: нет
Всего: 1



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

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

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


PM MAIL   Вверх
ivashkanet
Дата 27.12.2007, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: нет
Всего: 149



Royan, прикольно  smile 

Только вот таблица все равно остается только одна, а наличее такого рода ифов в тригере мне, мягко говоря, не нравиться. Уж лучше три тригера иметь на каждый тип изменения.
PM MAIL WWW ICQ   Вверх
DimW
Дата 27.12.2007, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



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

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

все зависит от конкретной задачи.
PM MAIL ICQ   Вверх
behelit_ru
Дата 12.2.2008, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 12.2.2008

Репутация: нет
Всего: нет



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

Нужно написать функцию, которая выбирает значение из последовательности и возвращает его...
а потом для таблиц написать одинаковые триггеры, которые вызывают эту функцию (в случае чего нужно будет править только одну функцию, а не кучу триггеров).
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.1216 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.