Я использую версию 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;
.
- В чем может быть причина того, что запись
bin*
помещена в таблицу user_procedures
? - Есть ли способ ее решить?как?
У меня есть DROP ANY PROCEDURE
системная привилегия (у меня есть другие процедуры, которые отбрасываются совершенно нормально)