Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.10.16;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.009 c
1-51196
Alexious
2003-10-03 16:55
2003.10.16
Focus


1-51324
pavlov
2003-10-07 10:17
2003.10.16
пишу новый компонент - возникли вопросы


1-51194
User_OKA
2003-10-07 10:44
2003.10.16
Перевод


7-51531
Dark Elf
2003-08-03 16:33
2003.10.16
Программирование порта COM1 в Delphi


1-51229
ExE
2003-10-03 15:32
2003.10.16
почему





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский