2012-03-31 3 views
4

Короче (Tl; дг): При попытке удаления строк во время MERGE, Oracle 10g, кажется, игнорируют ON DELETE CASCADE заявления для внешних ключей. Я хотел бы знать, если это известная ошибка, функция (очевидно, прекращена в 11g), или что.MERGE и ON DELETE CASCADE в Oracle XE 10g

Подробнее:
Мне кажется, что в Oracle XE 10g, пытаясь удалить строки из таблицы в MERGE заявлении приводит к-ORA 02292 ошибок (нарушение ссылочной целостности) всякий раз, когда есть внешний ключ, ссылающийся на таблицу назначения слияния, даже если ON DELETE CASCADE был указан во внешнем ключевом ограничении. Например, скажем, создать три таблицы

CREATE TABLE Mysource(
    MykeyS NUMBER, 
    MystringS VARCHAR2(10), 
    CONSTRAINT Mysource_PK PRIMARY KEY(MykeyS) ENABLE 
); 

CREATE TABLE Mydest(
    MykeyD NUMBER, 
    MystringD VARCHAR2(10), 
    CONSTRAINT Mydest_PK PRIMARY KEY(MykeyD) ENABLE 
); 

CREATE TABLE Myother(
    Mykey NUMBER, 
    Mydate DATE, 
    CONSTRAINT Myother_FK FOREIGN KEY(Mykey) 
    REFERENCES Mydest(MykeyD) ON DELETE CASCADE ENABLE 
); 

и вставить некоторые данные в них, а затем попробовать

MERGE INTO Mydest D 
USING Mysource S 
ON (D.MykeyD=S.MykeyS) 
WHEN MATCHED THEN 
UPDATE SET D.MystringD = S.MystringS 
DELETE WHERE (S.MykeyS > 10) 
WHEN NOT MATCHED THEN 
INSERT (MykeyD, MystringD) 
VALUES (S.MykeyS, S.MystringS) 
WHERE (S.MykeyS <= 10) 

Если оба Mydest и Myother было несколько строк с> 10 ключа, попытка MERGE бы тогда приводят к ORA-02292, заявляя о нарушении ограничения Myother_FK. Это звучит нелогично для меня (я могу удалить строки из Mydest с помощью прямого DELETE, но не с MERGE?), И на самом деле это не похоже на Oracle XE 11g.

Вопрос: Знаете ли вы, что это известная ошибка или странная функция? Или, может быть, я что-то упускаю? Поиск в Интернете пока не помог.

+1

Хороший улов. Я думаю, что это ошибка в 10g. Воспроизведено в моем собственном тестовом примере на Oracle 10.2.0.4. Проверено, работает ли 11.2.0.1. –

+2

Оракул был указан как ошибка 8268746 в 10.2.0.3, исправленная в 11.2. Обход - не использовать слияние :) – Glenn

+1

C'mon, @Glenn, положите это как ответ! –

ответ

2

Оракул был указан как ошибка 8268746 в 10.2.0.3. Это зафиксировано в 11.2. Документ недоступен для связи снаружи, но он предоставляет тестовый пример, аналогичный приведенному выше вопросу. Обход должен состоять в том, чтобы не использовать оператор слияния (или обновление до 11.2).

+0

Еще раз спасибо! Недоступно ли для связи снаружи? Значит, для этого нет «официального» и проверяемого источника? – fudo

+1

@fudo Если у вас есть контракт на поддержку, вы можете зайти на сайт metalink.oracle.com и найти свою базу данных об ошибках. Введите номер ошибки, и вы ее найдете. Но для доступа к странице вам понадобится логин. – Glenn

+0

Ух ... У меня есть логин Oracle (я должен был создать его для загрузки Oracle XE 11g), но я не думаю, что у меня есть контракт _support. Спасибо, в любом случае :) – fudo