КАСКАД СЛИЯНИЯ и УДАЛЕНИЯ в Oracle XE 10g

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

Подробнее:
Мне кажется, что в 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.

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


person fudo    schedule 31.03.2012    source источник
comment
Хороший улов. Думаю это глюк в 10г. Воспроизведено с помощью моего собственного тестового примера на Oracle 10.2.0.4. Проверено работает на 11.2.0.1.   -  person Jeffrey Kemp    schedule 02.04.2012
comment
В Oracle она указана как ошибка 8268746 в 10.2.0.3, исправленная в 11.2. Обходной путь - не использовать слияние :)   -  person Glenn    schedule 04.04.2012
comment
Давай, @Glenn, поставь это как ответ!   -  person Adam Hawkes    schedule 10.04.2012
comment
спасибо @Glenn, я думаю, тебе стоит написать это в качестве ответа.   -  person fudo    schedule 11.04.2012
comment
@AdamHawkes Спасибо, ребята, ответ опубликован. Но на самом деле это был лучший вопрос, чем ответ. Как сказал Джеффри, хороший улов.   -  person Glenn    schedule 11.04.2012


Ответы (1)


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

person Glenn    schedule 11.04.2012
comment
Еще раз спасибо! Означает ли недоступность для внешних ссылок, что для этого нет официального и поддающегося проверке источника? - person fudo; 11.04.2012
comment
@fudo Если у вас есть контракт на поддержку, вы можете войти на сайт metalink.oracle.com и выполнить поиск в их базе данных об ошибках. Введите номер ошибки, и вы ее найдете. Но для доступа к странице вам понадобится логин. - person Glenn; 11.04.2012
comment
э ... У меня есть логин Oracle (мне пришлось создать его, чтобы загрузить Oracle XE 11g), но я не думаю, что у меня есть контракт на поддержку. Спасибо, в любом случае :) - person fudo; 16.04.2012