Один из вариантов - написать процедуру для вызова, если строка в таблице должна быть удалена, а не напрямую вызывать оператор DELETE
.В этой процедуре дочерние элементы сначала перемещаются, прежде чем узел окончательно удаляется.Однако для этого может потребоваться изменить приложения с помощью таблицы.
В качестве альтернативы переименуйте таблицу, чтобы поместить ее в «фон».
ALTER TABLE sucursal
RENAME TO sucursal_t;
Затем создайте представление с тем же именемТаблица была до того, как вы ее переименовали.Это оставляет представление на «переднем плане».
CREATE VIEW sucursal
AS
SELECT codsuc,
ganancia,
sucpadre
FROM sucursal_t;
В этом представлении теперь можно разместить триггер INSTEAD OF
для перехвата DELETE
s.Триггер сначала перемещает дочерние узлы узла, который собирается удалить, а затем удаляет узел в «фоновой» таблице.
CREATE OR REPLACE TRIGGER borrar_sucursal
INSTEAD OF DELETE
ON sucursal
FOR EACH ROW
BEGIN
DBMS_OUTPUT.PUT_LINE('Bueno pues lo intente');
UPDATE sucursal_t
SET sucpadre = :old.sucpadre
WHERE sucpadre = :old.codsuc;
DELETE FROM sucursal_t
WHERE codsuc = :old.codsuc;
END;
/
db <> fiddle
Таким образом, существующий код все еще может использовать таблицу, как и раньше.