• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

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

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

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;[/sql]

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

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

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

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

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

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

ВОТ! :o

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

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

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab