Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.16;
Скачать: CL | DM;

Вниз

FOREIGN KEY   Найти похожие ветки 

 
DenK_vrtz ©   (2003-09-25 15:57) [0]

Всем привет

Есть две таблицы

схема A
create table RASHOD
(
ITEM_ID NUMBER(12) not null,
PACKET_RNO NUMBER(9,2) null ,
constraint PK_SGP_RASHOD primary key (ITEM_ID)
)

и
Схема B
create table PRIHOD_PT
(
ID NUMBER not null,
RASHOD_TESC_ID NUMBER(12) not null,
constraint PK_NKT_PRIHOD_PT primary key (ID),
FK_RASHOD_TESC_PT FOREIGN KEY (RASHOD_TESC_ID) REFERENCES A.RASHOD (ITEM_ID)
)

которые лежат в разных схемах, все превилегии выданы!

Триггер на insert таблицы RASHOD одновременно вставляет данные в PRIHOD_PT.
В 8.1.6. все проходит без ошибок, а в 8.0.5. ругается, что таблица RASHOD мутирующая (table A.RASHOD is mutatig, trigger/function may not see it)

В чем разница?

Заранее спасибо!


 
DenK_vrtz ©   (2003-09-25 16:05) [1]

в догонку
сделал в 8.0.5 Disable констрейнту FK_RASHOD_TESC_PT и ошибка исчезла


 
Johnmen ©   (2003-09-25 16:10) [2]

См.документацию, в частности директиву прекомпилятору
PRAGMA RESTRICT_REFERENCES


 
Vlad ©   (2003-09-25 16:18) [3]

>Johnmen © (25.09.03 16:10) [2]
Ни разу не пробовал прагму в триггере использовать...
Такое бывает ?


 
Johnmen ©   (2003-09-25 16:23) [4]

Почему бы и нет ?
Стоит попробовать...:)


 
DenK_vrtz ©   (2003-09-26 08:05) [5]

Спасибо за ответы.
Вчера не смог ответить инет вырубился.

Johnmen ©, попробую. Честно сказать, как и Vlad ©, никогда прагму в триггере не использовал. Будет повод!
Одного понять не могу.
Почему в 8.0.5. не явно срабатывает констрейнт FOREIGN KEY (т.е. нет ошибки по вторичному ключу), хотя транзакция еще не закончилась? Обычно, ошибка мутирующих таблиц возникает, когда в триггере на update пытаешься сделать select из этой же таблицы.

В чем разница с 8.1.6. ? В ней же нет ошибки!


 
Sergey13 ©   (2003-09-26 09:14) [6]

А можно на сам тригер глянуть?


 
DenK_vrtz ©   (2003-09-26 09:40) [7]

create or replace trigger RASHOD_BEF_INS before insert
on RASHOD for each row
declare
begin

--тут несколько селектов для проверки

select sq_rashod.nextval into :new.item_id from dual;

if :new.PACKET_RNO is not null then
insert into B.PRIHOD_PT (RASHOD_TESC_ID)
values(:new.item_id);
end if;

end;

/
show errors


 
DenK_vrtz ©   (2003-09-26 09:46) [8]

Теоретически 8.0.5. делает правильно выдавая ошибку!
Но почему не ругается 8.1.6.?!


 
DenK_vrtz ©   (2003-09-26 10:00) [9]

А может 8.1.6. по сравнению с 8.0.5. мегамозг? :-)


 
DenK_vrtz ©   (2003-09-26 10:05) [10]

Во как!

В триггере на DELETE таблицы RASHOD идут проверки, а затем удаляется(или не удаляется) соответствующая строчка в PRIHOD_PT.

ВНИМАНИЕ! В 8.1.6. ошибок как не было, так и нет, а в 8.0.5. ошибка вторичного ключа.
Уверяю всех, что наличие в обеих базах ключей, констрейнтов и индексов на таблицы АБСОЛЮТНО одинаково.

Мистика какая то!


 
Sergey13 ©   (2003-09-26 10:06) [11]

А если вставлять не :new.item_id а sq_rashod.curval?
Ругается то он на мутацию, а не на нарушение ключа, как я понял.


 
Johnmen ©   (2003-09-26 10:07) [12]

>DenK_vrtz ©

Я так думаю, что в более поздней версии они просто устранили данную фичу (а где-то даже и баг). И не более того...:)


 
DenK_vrtz ©   (2003-09-26 10:20) [13]

Johnmen ©, вот я тоже это подозреваю. Ведь разбор полетов идет на уровне транзакции, поэтому 8.1.6. думает, что вставлять (удалять) первой в зависимости от ссылочной целостности, а 8.0.5. видимо не думает :-)
Прочитал в умной книге по 8.0.5., что при вставке данных в главную таблицу вся подчиненная таблица блокируется в разделяемом режиме.

>Sergey13 ©. Сергей, а что это меняет?!


 
Sergey13 ©   (2003-09-26 11:05) [14]

2DenK_vrtz © (26.09.03 10:20) [13]
>Сергей, а что это меняет?!
Это я пытаюсь давать шаманские советы с похмелья. 8-)
Хотя... Мутация - это когда ссылаешься на поле изменяемой таблицы. :new.pole это конечно не совсем поле, но все таки. А вставляя переменную ты вообще как бы независим от таблицы.

>Прочитал в умной книге по 8.0.5., что при вставке данных в главную таблицу вся подчиненная таблица блокируется в разделяемом режиме.
Это вроде только если нет индекса на форинкейное поле.

А инит.ора для обеих баз одинаков? Интересно просто.


 
DenK_vrtz ©   (2003-09-26 11:20) [15]

>А инит.ора для обеих баз одинаков?

Разница, говорят, есть. А что конкретно интересно?


 
Sergey13 ©   (2003-09-26 11:29) [16]

2DenK_vrtz © (26.09.03 11:20) [15]
>Разница, говорят, есть. А что конкретно интересно?
Да я так просто, говорю же с похмелья. 8-)
Я не помню точно, но вроде были какие то параметры по транзакциям которыми можно порулить. Но это ковыряться надо, вспоминать. А мне тяжко. К тому же это может и вообще не из той оперы и все сказал Johnmen © (26.09.03 10:07) [12] .


 
DenK_vrtz ©   (2003-09-26 12:18) [17]

Sergey13 ©, в общем проблема решаема! :-)
Уже победил!

Всем спасибо!



Страницы: 1 вся ветка

Текущий архив: 2003.10.16;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.02 c
3-51134
Ser_fantom
2003-09-24 10:55
2003.10.16
Не работает locate


1-51286
Vemer
2003-10-06 16:27
2003.10.16
Красивое форматирование в QuickReport.


6-51391
Печкин
2003-08-20 18:32
2003.10.16
Ограничение числа сокетов


1-51166
beglec
2003-10-05 13:03
2003.10.16
Как узнать чековую сумму файла?


3-51113
Stas
2003-09-25 09:46
2003.10.16
Когда считывается информация из Blob полей ?