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

Тема в разделе "Остальные БД", создана пользователем Aleksandr06, 22 апр 2008.

  1. Aleksandr06

    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-значение. :-(
     
  2. Shader88

    Shader88 Гость

    Aleksandr06,

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

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

    ???? Гость

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

    Shader88 Гость

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

    ???? Гость

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

    Shader88 Гость

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

    Если например секвенс был установлен так что первое значение будет 1, и инкремент 1, то на 500 записях будет работать:
    Добавление 1-ой записи:
    Код (Text):
    select Gen_Uniq_Key.NextVal into :New.Unique_Code_Of_Record from DUAL; -- теперь :New.Unique_Code_Of_Record = 1
    2-ой записи
    Код (Text):
    select Gen_Uniq_Key.NextVal into :New.Unique_Code_Of_Record from DUAL; -- теперь :New.Unique_Code_Of_Record = 2
    ...
    500-ой
    Код (Text):
    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 триггер это делает сам без лишних движений :)
     
Загрузка...
Похожие Темы - работа триггером
  1. Andrey Kha
    Ответов:
    0
    Просмотров:
    19
  2. Hoasker
    Ответов:
    0
    Просмотров:
    64
  3. garri671
    Ответов:
    0
    Просмотров:
    52
  4. lelik200969
    Ответов:
    0
    Просмотров:
    50
  5. Kozolick
    Ответов:
    0
    Просмотров:
    136

Поделиться этой страницей