проблема в том, чтобы вместо удаления взглядов в оракуле - PullRequest
1 голос
/ 11 октября 2019

У меня есть вид:

select * from ot.vw_rebellionrid;

, который показывает мне:

enter image description here

full_name - столбецtrainer таблица subject_name является столбцом subject таблица

Представление имеет запрос:

SELECT full_name, subject_name
     FROM ot.trainer, ot.subject;

Итак, я изучаю вместо удаления тигра, поэтому код длявместо триггера есть:

CREATE OR REPLACE TRIGGER ot.io_delete
INSTEAD OF DELETE ON ot.vw_RebellionRid
FOR EACH ROW
BEGIN
  DELETE FROM ot.trainer WHERE FULL_NAME = :old.FULL_NAME;
  DELETE FROM ot.subject WHERE SUBJECT_NAME= :old.SUBJECT_NAME;
END;
/

Итак, чтобы выполнить этот триггер, я выполняю следующую инструкцию:

delete from ot.vw_RebellionRid where subject_name='java';

, когда он выполняется, затем:

2 rows deleted.

В соответствии с моим пониманием, поскольку в двух строках в качестве java для оставшегося вывода есть subject_name, я думаю, что будет после удаления:

--------------------------
full_name | subject_ name |
---------------------------
Manish Sharma Oracle      |
ashwin        Oracle      |
---------------------------

Но когда я выполнил

select * from ot.vw_RebellionRid ;

, тогдаЯ получил вывод как ПУСТОЙ ТАБЛИЦА;

enter image description here

Так как были 4 строки, 2 строки были удалены, но когда я снова выбираю вид, то как яя получаю пустую таблицу? У меня должны были остаться две строки.

Ответы [ 2 ]

3 голосов
/ 11 октября 2019

Я думаю, что ваш триггер работает отлично.

DELETE FROM ot.trainer WHERE FULL_NAME = :old.FULL_NAME;

Он удалит 2 строки с именами manish и ashwin, так как обе помечены java.

. Точно так же,

DELETE FROM ot.subject WHERE SUBJECT_NAME= :old.SUBJECT_NAME;

Он удалит тему java из темы таблицы, так что теперь в таблице subject останется 1 запись, т.е. Oracle

Теперь ваш запрос на просмотр присоединитсямежду 2 таблицами (trainer таблица с 0 строками и subject таблица с 1 строками), поэтому она не дает результата.

Необходимо понимать, что

delete from ot.vw_RebellionRid where subject_name='java';

удаляетвсего 3 записи.

Ура !!

2 голосов
/ 11 октября 2019

Проблема в том, что при отладке вашей проблемы вы не выполняли ее. Ваш триггер INSTEAD OF DELETE определенно удалил что-то, но чтобы определить , что было удалено, вам нужно взглянуть на таблицы, лежащие в основе представления. Если вы выполните оператор DELETE, а затем изучите содержимое TRAINER и SUBJECT, вы обнаружите, что единственное, что осталось, это строка Oracle в SUBJECT. И если вы посмотрите на свой триггер и подумаете о том, что вы сказали ему сделать , вы поймете, что он сделал именно то, что вы сказали ему делать, даже если это могло быть не то, что вы хотели.

dbfiddle здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...