1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программировании. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление

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

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

  1. Aleksandr06

    Aleksandr06 Гость

    Репутация:
    0
    я использую следующий триггрер:
    [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 Гость

    Репутация:
    0
    Aleksandr06,

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

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

    ???? Гость

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

    Shader88 Гость

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

    ???? Гость

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

    Shader88 Гость

    Репутация:
    0
    ????, я же написал.
    Создаешь секвенс. Имя даешь 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
     
  7. ????

    ???? Гость

    Репутация:
    0
    Не верю! (с) :)

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

    ВОТ! :o

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

    З.Ы. row level триггер это делает сам без лишних движений :)
     
Загрузка...
Похожие Темы - работа триггером
  1. fan92rus
    Ответов:
    5
    Просмотров:
    91
  2. erlan1749
    Ответов:
    10
    Просмотров:
    125
  3. ghostik
    Ответов:
    9
    Просмотров:
    359
  4. nerfy
    Ответов:
    15
    Просмотров:
    160
  5. Васян
    Ответов:
    6
    Просмотров:
    163

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