Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Триггеры и первичные ключи, Триггер для вставки строк 
:(
    Опции темы
mgukov
Дата 27.12.2009, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 22.3.2009

Репутация: нет
Всего: нет



Есть 2 таблице - ЗАКАЗ и ВЫДАЧА, как показано на рисунке. Ключевое поле одной таблицы является ключевым и внешним полем другой таблицы. Мне нужен триггер который при вставке строки в первую таблицу, добавляет строку во вторую. Проблема с первичным ключем. Подскажите как можно реализовать такой триггер?


Это сообщение отредактировал(а) mgukov - 27.12.2009, 19:42

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  shema.jpg 29,65 Kb
PM MAIL   Вверх
v2v
Дата 27.12.2009, 23:35 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: 1
Всего: 56



если я правильно понял, то триггер должен выглядеть следующим образом:
Код



    CREATE OR REPLACE TRIGGER после_вставки_заказа
    AFTER INSERT
        ON ЗАКАЗЫ
        FOR EACH ROW

    DECLARE

    BEGIN

        INSERT INTO ВЫДАЧА
         ( ид_заказа,
           дата )
        VALUES
         ( :new.ид_заказа,
            sysdate);

    END;



Это сообщение отредактировал(а) v2v - 27.12.2009, 23:38


--------------------
PM   Вверх
mgukov
Дата 28.12.2009, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 22.3.2009

Репутация: нет
Всего: нет



Именно так я и делал, однако возникает ошибка:
Error starting at line 4 in command:
INSERT INTO ЗАКАЗ VALUES(100, 'не оплачен', NULL, 100, 104)
Error report:
SQL Error: ORA-02291: integrity constraint (USER1.RELATION_6) violated - parent key not found
ORA-06512: at "USER1.TIA_ЗАКАЗ", line 2
ORA-04088: error during execution of trigger 'USER1.TIA_ЗАКАЗ'
02291. 00000 - "integrity constraint (%s.%s) violated - parent key not found"
*Cause:    A foreign key value has no matching primary key value.
*Action:   Delete the foreign key or add a matching primary key.

Так как в таблице ВЫДАЧА поле заказ_ид является внешним ключем, то при добавлении в нее новой записи с :new.заказ_ид, oracle пытается найти это значение в таблице ЗАКАЗ, но этого (:new.заказ_ид) значения там еще нет.

Это сообщение отредактировал(а) mgukov - 28.12.2009, 00:11
PM MAIL   Вверх
Zloxa
Дата 28.12.2009, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(mgukov @  28.12.2009,  00:10 Найти цитируемый пост)
но этого (:new.заказ_ид) значения там еще нет.

есть.
если триггер after, как написал v2v.

Код

create table заказ (id number primary key);
 
Table created
create table выдача (заказ number references заказ(id));
 
Table created
create trigger заказ_ai after insert on Заказ for each row
begin
  insert into выдача values (:new.id);
end;
/
 
Trigger created
insert into заказ values(1);
 
1 row inserted
select * from выдача;
 
     ЗАКАЗ
----------
         1
 



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
mgukov
Дата 28.12.2009, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 22.3.2009

Репутация: нет
Всего: нет



Да, действительно.
Всем спасибо

Это сообщение отредактировал(а) mgukov - 28.12.2009, 02:13
PM MAIL   Вверх
Zloxa
Дата 28.12.2009, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



меня в этой ситуации больше всего интересует - от чего при проверке констрейнта ошибка не поднимается.
Маcтер таблица ведь находится в состоянии модификации - мутирует.
Шаманство какоето.
 smile 


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
DimW
Дата 28.12.2009, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



Цитата(Zloxa @  28.12.2009,  10:31 Найти цитируемый пост)
Шаманство какоето.

да вроде ровно все, в случае с before:
Код

SQL> create trigger заказ_bi before insert on Заказ for each row
  2  begin
  3    insert into выдача values (:new.id);
  4  end;
  5  /
 
Trigger created
SQL> insert into заказ values(2);
 
insert into заказ values(2)
 
ORA-02291: integrity constraint (TIS.SYS_C0010351) violated - parent key not found
ORA-06512: at "TIS.ЗАКАЗ_BI", line 2
ORA-04088: error during execution of trigger 'TIS.ЗАКАЗ_BI'
SQL> /


в случае с after, все выполняется в одной транзакции, так что в случае исключения все откатится.

PM MAIL ICQ   Вверх
Zloxa
Дата 28.12.2009, 13:45 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



DimW, то что ровно - то понятно. Не понятно почему в частном случае проверки целостности по FK позволяется доступ к мутирующей таблице, в то время как  в общем случае - нет smile Именно то я и назвал шаманством. Возьмись ты чекануть констрейнт сам - ты бы этого сделать не смог бы.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
DimW
Дата 28.12.2009, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



Цитата(Zloxa @  28.12.2009,  13:45 Найти цитируемый пост)
Возьмись ты чекануть констрейнт сам - ты бы этого сделать не смог бы. 

мда, действительно:
Код

SQL> create table заказ (id number);
 
Table created
SQL> create table выдача (заказ number);
 
Table created
SQL> create trigger заказ_ai after insert on Заказ for each row
  2  begin
  3    insert into выдача values (:new.id);
  4  end;
  5  /
 
Trigger created
SQL> create trigger выдача_bi before insert on выдача for each row
  2  declare
  3   n number;
  4  begin
  5    select count(1) into n from заказ where id = :new.заказ;
  6    if n=0 then
  7      raise_application_error(-20555, 'parent key not found');
  8    end if;
  9  end;
 10  /
 
Trigger created
SQL> insert into заказ values(1);
 
insert into заказ values(1)
 
ORA-04091: table TIS.ЗАКАЗ is mutating, trigger/function may not see it
ORA-06512: at "TIS.ВЫДАЧА_BI", line 4
ORA-04088: error during execution of trigger 'TIS.ВЫДАЧА_BI'


действительно, настораживает... 
даже не занаю как к этому относиться, как фиче, или багу...  smile 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0490 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.