![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
FOREIGN KEY [D3, Oracle]
DenK_vrtz © (2003-09-25 15:57:00)
Всем привет
Есть две таблицы
схема 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-26 12:18:00) [1]
Sergey13 ©, в общем проблема решаема! :-)
Уже победил!
Всем спасибо!
Sergey13 (2003-09-26 11:29:00) [2]
2DenK_vrtz © (26.09.03 11:20) [15]
>Разница, говорят, есть. А что конкретно интересно?
Да я так просто, говорю же с похмелья. 8-)
Я не помню точно, но вроде были какие то параметры по транзакциям которыми можно порулить. Но это ковыряться надо, вспоминать. А мне тяжко. К тому же это может и вообще не из той оперы и все сказал Johnmen © (26.09.03 10:07) [12] .
DenK_vrtz (2003-09-26 11:20:00) [3]
>А инит.ора для обеих баз одинаков?
Разница, говорят, есть. А что конкретно интересно?
Sergey13 (2003-09-26 11:05:00) [4]
2DenK_vrtz © (26.09.03 10:20) [13]
>Сергей, а что это меняет?!
Это я пытаюсь давать шаманские советы с похмелья. 8-)
Хотя... Мутация - это когда ссылаешься на поле изменяемой таблицы. :new.pole это конечно не совсем поле, но все таки. А вставляя переменную ты вообще как бы независим от таблицы.
>Прочитал в умной книге по 8.0.5., что при вставке данных в главную таблицу вся подчиненная таблица блокируется в разделяемом режиме.
Это вроде только если нет индекса на форинкейное поле.
А инит.ора для обеих баз одинаков? Интересно просто.
DenK_vrtz (2003-09-26 10:20:00) [5]
Johnmen ©, вот я тоже это подозреваю. Ведь разбор полетов идет на уровне транзакции, поэтому 8.1.6. думает, что вставлять (удалять) первой в зависимости от ссылочной целостности, а 8.0.5. видимо не думает :-)
Прочитал в умной книге по 8.0.5., что при вставке данных в главную таблицу вся подчиненная таблица блокируется в разделяемом режиме.
>Sergey13 ©. Сергей, а что это меняет?!
Johnmen (2003-09-26 10:07:00) [6]
>DenK_vrtz ©
Я так думаю, что в более поздней версии они просто устранили данную фичу (а где-то даже и баг). И не более того...:)
Sergey13 (2003-09-26 10:06:00) [7]
А если вставлять не :new.item_id а sq_rashod.curval?
Ругается то он на мутацию, а не на нарушение ключа, как я понял.
DenK_vrtz (2003-09-26 10:05:00) [8]
Во как!
В триггере на DELETE таблицы RASHOD идут проверки, а затем удаляется(или не удаляется) соответствующая строчка в PRIHOD_PT.
ВНИМАНИЕ! В 8.1.6. ошибок как не было, так и нет, а в 8.0.5. ошибка вторичного ключа.
Уверяю всех, что наличие в обеих базах ключей, констрейнтов и индексов на таблицы АБСОЛЮТНО одинаково.
Мистика какая то!
DenK_vrtz (2003-09-26 10:00:00) [9]
А может 8.1.6. по сравнению с 8.0.5. мегамозг? :-)
DenK_vrtz (2003-09-26 09:46:00) [10]
Теоретически 8.0.5. делает правильно выдавая ошибку!
Но почему не ругается 8.1.6.?!
DenK_vrtz (2003-09-26 09:40:00) [11]
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
Sergey13 (2003-09-26 09:14:00) [12]
А можно на сам тригер глянуть?
DenK_vrtz (2003-09-26 08:05:00) [13]
Спасибо за ответы.
Вчера не смог ответить инет вырубился.
Johnmen ©, попробую. Честно сказать, как и Vlad ©, никогда прагму в триггере не использовал. Будет повод!
Одного понять не могу.
Почему в 8.0.5. не явно срабатывает констрейнт FOREIGN KEY (т.е. нет ошибки по вторичному ключу), хотя транзакция еще не закончилась? Обычно, ошибка мутирующих таблиц возникает, когда в триггере на update пытаешься сделать select из этой же таблицы.
В чем разница с 8.1.6. ? В ней же нет ошибки!
Johnmen (2003-09-25 16:23:00) [14]
Почему бы и нет ?
Стоит попробовать...:)
Vlad (2003-09-25 16:18:00) [15]
>Johnmen © (25.09.03 16:10) [2]
Ни разу не пробовал прагму в триггере использовать...
Такое бывает ?
Johnmen (2003-09-25 16:10:00) [16]
См.документацию, в частности директиву прекомпилятору
PRAGMA RESTRICT_REFERENCES
DenK_vrtz (2003-09-25 16:05:00) [17]
в догонку
сделал в 8.0.5 Disable констрейнту FK_RASHOD_TESC_PT и ошибка исчезла