Объект корзины, который нельзя удалить после удаления триггера - PullRequest
0 голосов
/ 22 декабря 2018

Я использую версию Oracle 12c.Я создал триггер, который должен создать запись аудита, поэтому он называется before update (я упростил следующий пример, чтобы сделать его читаемым - ошибка остается прежней).Я использую цель муравья для clean db (первый шаг всей цели recreate).clean db шаг выглядит следующим образом:

BEGIN
    FOR c IN (SELECT object_name FROM user_procedures) LOOP
        EXECUTE IMMEDIATE ('DROP PROCEDURE "' || c.object_name || '"');
    END LOOP;
END;
/

есть еще два цикла для user_tables и user_views (пропущено для краткости, порядок вызовов user_tables, затем user_views, а затем user_procedures).Когда я помещаю свой триггер в сценарии миграции (я использую flyway):

CREATE OR REPLACE TRIGGER trg_car_audit
    BEFORE UPDATE
    ON CAR
    FOR EACH ROW
BEGIN
    INSERT INTO CAR (ID, MANUFACTURER, MODEL)
    VALUES (:OLD.ID, :OLD.MANUFACTURER, :OLD.MODEL);
END;
/

Во всей цели recreate db ant она достигает точки в clean db target, где я получаю:

Failed to execute:  BEGIN FOR c IN (SELECT object_name FROM user_procedures) LOOP EXECUTE IMMEDIATE ('DROP PROCEDURE "' || c.object_name || '"'); END LOOP; END; 
java.sql.SQLSyntaxErrorException: ORA-04043: object BIN$fZDGeHfvC9bhUiQJFawHpg==$0 doesn't exist

Когда я выполняю: SELECT * FROM user_procedures, это дает мне:

OBJECT_NAME                     PROCEDURE_NAME OBJECT_ID SUBPROGRAM_ID OVERLOAD  OBJECT_TYPE  AGGREGATE  PIPELINED  IMPLTYPEOWNER IMPLTYPENAME PARALLEL INTERFACE  DETERMINISTIC AUTHID   ORIGIN_CON_ID
------------------------------- -------------- --------- ------------- --------- ------------ ---------- ---------- ------------- ------------ -------- ---------- ------------- -------  -------------
BIN$fZDGeHfvC9bhUiQJFawHpg==$0  NULL           120236    1             NULL      TRIGGER      NO         NO         NULL          NULL         NO       NO         NO            DEFINER  0

Я могу избавиться от этого только на purge recyclebin;.


  1. В чем может быть причина того, что запись bin* помещена в таблицу user_procedures?
  2. Есть ли способ ее решить?как?

У меня есть DROP ANY PROCEDURE системная привилегия (у меня есть другие процедуры, которые отбрасываются совершенно нормально)

1 Ответ

0 голосов
/ 22 декабря 2018

Ваша процедура пытается отбросить что-то уже отброшенное.Вы можете узнать это, потому что его имя начинается с 'BIN $'.Проблема исчезает после того, как очистка подтверждает это.

Решение состоит в том, чтобы фильтровать имя_объекта, не начинающегося с 'BIN $'

BEGIN
    FOR c IN (SELECT object_name FROM user_procedures
              WHERE object_name NOT LIKE 'BIN$%' ) LOOP
        EXECUTE IMMEDIATE ('DROP PROCEDURE "' || c.object_name || '"');
    END LOOP;
END;
/
...