Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: работа с триггером
Форум программистов > Базы данных и администрирование > Остальные БД
Aleksandr06
я использую следующий триггрер:
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
Aleksandr06,

Весь код триггера такой:
Код
select GEN_PERSON_ID.NextVal into :New.ID from DUAL;


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

Цитата
FOR EACH ROW

тут глупо и бесполезно =) Потому что триггер срабатывает НА КАЖДУЮ запись(строчку) отдельно =)
????
Цитата(Aleksandr06 @ 22:04:2008 - 13:00) *
то он ругается

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

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

????, триггер срабатывает НА КАЖДУЮ СТРОЧКУ.
Будете вставлять(Insert) 500 записей, триггер сработает 500 раз. =)
Зачем огород городить?! wacko.gif
????
Shader88
буду вставлять 500 записей, с генерацией уникального первичного ключа. как это можно сделать не генерируя ключ для каждой записи? o_O
Shader88
????, я же написал.
Создаешь секвенс. Имя даешь 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
????
Не верю! (с) smile.gif

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

ВОТ! smile.gif

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

З.Ы. row level триггер это делает сам без лишних движений smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Русская версия IP.Board © 2001-2008 IPS, Inc.