работа с триггером

  • Автор темы Aleksandr06
  • Дата начала
A

Aleksandr06

#1
я использую следующий триггрер:
[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;[/sql]

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

Shader88

#2
Aleksandr06,

Весь код триггера такой:
Код:
select GEN_PERSON_ID.NextVal into :New.ID from DUAL;
Gen_PERSON_ID задаешь в SEQUENCE =)

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

????

#3
он это кто? все должно отрабатывать. может ругаться клиент, который проверяет наличие значений для not null полей (т.к. он не знает о присвоении значения в триггере). через sqlplus строку вставить удается?
это необходимо! ID ведь надо назначить для каждой!!! строки.
 
S

Shader88

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

????

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

Shader88

#6
????, я же написал.
Создаешь секвенс. Имя даешь 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 =)

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

????

#7
Не верю! (с) :)

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

ВОТ! :eek:

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

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