Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум программистов _ Остальные БД _ работа с триггером

Автор: Aleksandr06 22:04:2008, 11:00

я использую следующий триггрер:

SQL
CREATE OR REPLACE TRIGGER PERSON_BIR
BEFORE INSERT ON PERSON
FOR EACH ROW
BEGIN IF :new.ID IS NULL THEN
SELECT PERSON_SEQ.nextval INTO :new.ID FROM dual;
END IF;
END PERSON_BIR;


Что нужно писать для значения поля в столбце ID при создании записи в таблице PERSON?
Если просто ничего не присваивать - то он ругается, что он не может присвоить null-значение. :-(

Автор: Shader88 23:04:2008, 07:37

Aleksandr06,

Весь код триггера такой:

Код
select GEN_PERSON_ID.NextVal into :New.ID from DUAL;


Gen_PERSON_ID задаешь в SEQUENCE =)

Цитата
FOR EACH ROW

тут глупо и бесполезно =) Потому что триггер срабатывает НА КАЖДУЮ запись(строчку) отдельно =)

Автор: ???? 23:04:2008, 11:07

Цитата(Aleksandr06 @ 22:04:2008 - 13:00) *
то он ругается

он это кто? все должно отрабатывать. может ругаться клиент, который проверяет наличие значений для not null полей (т.к. он не знает о присвоении значения в триггере). через sqlplus строку вставить удается?
Цитата(Shader88 @ 23:04:2008 - 09:37) *
тут глупо и бесполезно

это необходимо! ID ведь надо назначить для каждой!!! строки.

Автор: Shader88 23:04:2008, 12:29

Цитата
ID ведь надо назначить для каждой!!! строки.

????, триггер срабатывает НА КАЖДУЮ СТРОЧКУ.
Будете вставлять(Insert) 500 записей, триггер сработает 500 раз. =)
Зачем огород городить?! wacko.gif

Автор: ???? 23:04:2008, 16:57

Shader88
буду вставлять 500 записей, с генерацией уникального первичного ключа. как это можно сделать не генерируя ключ для каждой записи? o_O

Автор: Shader88 24:04:2008, 07:13

????, я же написал.
Создаешь секвенс. Имя даешь Gen_Uniq_Key, задаешь ему необходимые параметры.
В триггере забираешь новое значение из него(Gen_Uniq_Key.NextVal) и записываешь в поле уникального ключа записи(:New.Unique_Code_Of_Record). Вот так:

Код
select Gen_Uniq_Key.NextVal into :New.Unique_Code_Of_Record from DUAL;



Если например секвенс был установлен так что первое значение будет 1, и инкремент 1, то на 500 записях будет работать:
Добавление 1-ой записи:
Код
select Gen_Uniq_Key.NextVal into :New.Unique_Code_Of_Record from DUAL; -- теперь :New.Unique_Code_Of_Record = 1

2-ой записи
Код
select Gen_Uniq_Key.NextVal into :New.Unique_Code_Of_Record from DUAL; -- теперь :New.Unique_Code_Of_Record = 2

...
500-ой
Код
select Gen_Uniq_Key.NextVal into :New.Unique_Code_Of_Record from DUAL; -- теперь :New.Unique_Code_Of_Record = 500


В итоге в таблице ключевое поле, тоже будет иметь значения 1..500 =)

????, я просто не могу понять где проблема? wacko.gif Или не знаете как работают триггеры и секвенсы?! wacko.gif

Автор: ???? 24:04:2008, 08:06

Не верю! (с) smile.gif

ORA-04082: ссылки на NEW или OLD недопустимы в триггерах уровня таблицы

ВОТ! smile.gif

как работают сиквенсы я знаю, тем более триггеры. а что-бы понять проблему, надо попробовать на практике создать statement триггер заполняющий ID из сиквенса, который при этом будет работать с BULK INSERT'ом, FORALL'ом не будет вызывать мутирование таблиц и т.д. smile.gif

З.Ы. row level триггер это делает сам без лишних движений smile.gif

Русская версия Invision Power Board (http://www.nulled.ws)
© Invision Power Services (http://www.nulled.ws)