Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 1 != 1 @11.2.0.3 ?  [new]
guest22
Guest
Довольно загадочная для меня ситуация - внешний ключ "не видит" данные в подчиненной таблице, вставленные триггером before insert:

CREATE TABLE T_SLAVE (ID NUMBER PRIMARY KEY);
CREATE TABLE T_MASTER (ID NUMBER PRIMARY KEY);

ALTER TABLE T_MASTER ADD (
  CONSTRAINT C_MASTER_SLAVE_FK 
  FOREIGN KEY (ID) REFERENCES T_SLAVE (ID)
);

CREATE OR REPLACE TRIGGER trinsT_MASTER
  before insert ON T_MASTER
  for each row
begin
  insert into T_SLAVE values (:new.ID);
end;
/

-- ORA-02291: Parent key not found
insert into T_MASTER (ID) values (1);

-- Второй раз этот же оператор исполняется успешно
insert into T_MASTER (ID) values (1);


Я далек от мысли, что это глобальный баг - иначе был бы давно поднят шум, однако у меня стабильно воспроизводится в 11.2.0.3 (linux/solaris) и не воспроизводится ни в одной девятке-десятке.
17 июл 12, 15:53    [12878576]     Ответить | Цитировать Сообщить модератору
 Re: 1 != 1 @11.2.0.3 ?  [new]
AmKad
Member

Откуда:
Сообщений: 5222
guest22,

+ У меня не воспроизвелось

select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE    11.2.0.3.0      Production
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production

Затрач.время: 00:00:00.00

drop table t_slave cascade constraints purge;

Таблица удалена.

Затрач.время: 00:00:00.10
drop table t_master purge;

Таблица удалена.

Затрач.время: 00:00:00.03

create table t_slave (id number primary key);

Таблица создана.

Затрач.время: 00:00:00.08
create table t_master (id number primary key);

Таблица создана.

Затрач.время: 00:00:00.07

alter table t_master add (
  constraint c_master_slave_fk
  foreign key (id) references t_slave (id)
);

Таблица изменена.

Затрач.время: 00:00:00.06

create or replace trigger trinst_master
  before insert on t_master
  for each row
begin
  insert into t_slave values (:new.id);
end;
/

Триггер создан.

Затрач.время: 00:00:00.02

-- ORA-02291: Parent key not found
insert into t_master (id) values (1);

1 строка создана.

Затрач.время: 00:00:00.00

-- Второй раз этот же оператор исполняется успешно
insert into t_master (id) values (1);
insert into t_master (id) values (1)
            *
ошибка в строке 1:
ORA-00001: нарушено ограничение уникальности (AKADYROV.SYS_C00102300)
ORA-06512: на  "TRINST_MASTER", line 2
ORA-04088: ошибка во время выполнения триггера 'TRINST_MASTER'


Затрач.время: 00:00:00.00
17 июл 12, 16:05    [12878669]     Ответить | Цитировать Сообщить модератору
 Re: 1 != 1 @11.2.0.3 ?  [new]
AmKad
Member

Откуда:
Сообщений: 5222
guest22,

segment creation deferred?
17 июл 12, 16:11    [12878720]     Ответить | Цитировать Сообщить модератору
 Re: 1 != 1 @11.2.0.3 ?  [new]
AmKad
Member

Откуда:
Сообщений: 5222
+ deferred_segment_creation
select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE    11.2.0.3.0      Production
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production

Затрач.время: 00:00:00.00

drop table t_slave cascade constraints purge;

Таблица удалена.

Затрач.время: 00:00:00.05
drop table t_master purge;

Таблица удалена.

Затрач.время: 00:00:00.07

alter session set deferred_segment_creation = true;

Сеанс изменен.

Затрач.время: 00:00:00.00

create table t_slave (id number primary key);

Таблица создана.

Затрач.время: 00:00:00.20
create table t_master (id number primary key);

Таблица создана.

Затрач.время: 00:00:00.02

alter table t_master add (
  constraint c_master_slave_fk
  foreign key (id) references t_slave (id)
);

Таблица изменена.

Затрач.время: 00:00:00.06

create or replace trigger trinst_master
  before insert on t_master
  for each row
begin
  insert into t_slave values (:new.id);
end;
/

Триггер создан.

Затрач.время: 00:00:00.06

-- ORA-02291: Parent key not found
insert into t_master (id) values (1);
insert into t_master (id) values (1)
*
ошибка в строке 1:
ORA-02291: нарушено ограничение целостности (C_MASTER_SLAVE_FK) - исходный ключ не найден


Затрач.время: 00:00:00.02

-- Второй раз этот же оператор исполняется успешно
insert into t_master (id) values (1);

1 строка создана.

Затрач.время: 00:00:00.00


commit;

Фиксация обновлений завершена.

Затрач.время: 00:00:00.00
17 июл 12, 16:14    [12878756]     Ответить | Цитировать Сообщить модератору
 Re: 1 != 1 @11.2.0.3 ?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
guest22,

вообще, slave / master у вас использованы мехом внутрь (если по феншую, то должно быть наоборот - слейв на мастера ссылается)
17 июл 12, 16:28    [12878887]     Ответить | Цитировать Сообщить модератору
 Re: 1 != 1 @11.2.0.3 ?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54395
не находите, какие-то необычные имена у главной и подчиненной таблицы?
ALTER TABLE T_MASTER ADD (
  CONSTRAINT C_MASTER_SLAVE_FK 
  FOREIGN KEY (ID) REFERENCES T_SLAVE (ID)
);
17 июл 12, 16:32    [12878931]     Ответить | Цитировать Сообщить модератору
 Re: 1 != 1 @11.2.0.3 ?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54395
orawish,

опоздал )
17 июл 12, 16:34    [12878958]     Ответить | Цитировать Сообщить модератору
 Re: 1 != 1 @11.2.0.3 ?  [new]
guest22
Guest
AmKad, в точку, спасибо.
17 июл 12, 16:37    [12878984]     Ответить | Цитировать Сообщить модератору
 Re: 1 != 1 @11.2.0.3 ?  [new]
-2-
Member

Откуда:
Сообщений: 15330
orawish
должно быть наоборот - слейв на мастера ссылается)
не фига. Начальника имеет связь с рабом своим инородным Куем
17 июл 12, 16:38    [12878996]     Ответить | Цитировать Сообщить модератору
 Re: 1 != 1 @11.2.0.3 ?  [new]
guest22
Guest
andreymx
не находите, какие-то необычные имена у главной и подчиненной таблицы?
ALTER TABLE T_MASTER ADD (
  CONSTRAINT C_MASTER_SLAVE_FK 
  FOREIGN KEY (ID) REFERENCES T_SLAVE (ID)
);

Имена даны в соответствии с логикой приложения - данные вставляются в большую главную таблицу, из которой триггерами разносятся по нескольким мелким подчиненным (они же справочники - в реляционной теории, конечно, они главнее, но с точки зрения юзера их вообще не видно)
17 июл 12, 16:45    [12879071]     Ответить | Цитировать Сообщить модератору
 Re: 1 != 1 @11.2.0.3 ?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54395
guest22,

путаница в терминах где-то обязательно скажется (в отрицательном виде)
17 июл 12, 16:49    [12879113]     Ответить | Цитировать Сообщить модератору
 Re: 1 != 1 @11.2.0.3 ?  [new]
guest22
Guest
Остаётся открытым вопрос - верно ли концептуально такое поведение оракла при включенном отложенном создании сегментов? Не должно ли оно отрабатывать без ошибок в любом случае?
17 июл 12, 16:50    [12879118]     Ответить | Цитировать Сообщить модератору
 Re: 1 != 1 @11.2.0.3 ?  [new]
-2-
Member

Откуда:
Сообщений: 15330
guest22
Остаётся открытым вопрос
баг
17 июл 12, 16:51    [12879126]     Ответить | Цитировать Сообщить модератору
 Re: 1 != 1 @11.2.0.3 ?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
guest22
andreymx
не находите, какие-то необычные имена у главной и подчиненной таблицы?
ALTER TABLE T_MASTER ADD (
  CONSTRAINT C_MASTER_SLAVE_FK 
  FOREIGN KEY (ID) REFERENCES T_SLAVE (ID)
);

Имена даны в соответствии с логикой приложения - данные вставляются в большую главную таблицу, из которой триггерами разносятся по нескольким мелким подчиненным (они же справочники - в реляционной теории, конечно, они главнее, но с точки зрения юзера их вообще не видно)

да называйте, как хотите, не вы первый - Мадамский и Жентельменский
17 июл 12, 16:54    [12879156]     Ответить | Цитировать Сообщить модератору
 Re: 1 != 1 @11.2.0.3 ?  [new]
kinky cat
Member

Откуда: с дивана23
Сообщений: 1238
автор
Я далек от мысли..

наивный человек

bug 9547706
заявлен для 10ки но патчик есть и для 11.2.0.3 ))
17 июл 12, 17:17    [12879330]     Ответить | Цитировать Сообщить модератору
 Re: 1 != 1 @11.2.0.3 ?  [new]
-2-
Member

Откуда:
Сообщений: 15330
kinky cat
bug 9547706
заявлен для 10ки
это совсем не том
17 июл 12, 17:19    [12879347]     Ответить | Цитировать Сообщить модератору
 Re: 1 != 1 @11.2.0.3 ?  [new]
kinky cat
Member

Откуда: с дивана23
Сообщений: 1238
-2-,
есть similar 13798806, с которого ссылка идет 9547706
там именно про deffered речь
в общем я бы попробовал накатить
17 июл 12, 17:32    [12879432]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить