Во время выполнения триггера возникает ошибка: ORA-00604: произошла ошибка на уровне рекурсивного SQL 1 ORA-00900: неверный оператор SQL

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

CREATE OR REPLACE TRIGGER create_table_trigger AFTER CREATE ON SCHEMA DECLARE
    lv_sql     VARCHAR2(5000);
   obj_name   VARCHAR2(500);
BEGIN
    obj_name := sys.dictionary_obj_name;
    lv_sql := 'EXEC SYS.DBMS_FGA.add_policy (object_schema     => ''AIM_DBA'',object_name => '''|| obj_name|| ''',policy_name => ''PROTECT_'|| obj_name || ''',audit_condition  => null,audit_column => NULL,handler_schema => ''AIM_DBA'',handler_module =>''WHERE_CLAUSE_PROTECTOR_PKG.TABLE_PROTECTOR'',enable => TRUE,statement_types => ''UPDATE,DELETE'')';
    IF
        sys.dictionary_obj_type = 'TABLE'
    THEN
        dbms_output.put_line(obj_name);
        dbms_output.put_line(lv_sql);
        EXECUTE IMMEDIATE lv_sql;
        dbms_output.put_line(lv_sql);
    END IF;

END;
/

ORA-04088: ошибка при выполнении триггера «AIM_DBA.CREATE_TABLE_TRIGGER» ORA-00604: ошибка на уровне рекурсивного SQL 1 ORA-00900: неверный оператор SQL ORA-06512: в строке 17

Назначение триггера: всякий раз, когда пользователь создает таблицу, после аудита должен быть включен для этой таблицы.

Сообщение об ошибке выполнения:

SQL> create table aim_dba.WHERE_TST27
(
    dummy varchar2(20)
);  2    3    4
WHERE_TST27
EXEC SYS.DBMS_FGA.add_policy (object_schema     => 'AIM_DBA',object_name => 'WHERE_TST27',policy_name => 'PROTECT_WHERE_TST27',audit_condition  => null,audit_column => NULL,handler_schema =>
'AIM_DBA',handler_module =>'WHERE_CLAUSE_PROTECTOR_PKG.TABLE_PROTECTOR',enable => TRUE,statement_types => 'UPDATE,DELETE')
create table aim_dba.WHERE_TST27
*
ERROR at line 1:
ORA-04088: error during execution of trigger 'AIM_DBA.CREATE_TABLE_TRIGGER'
ORA-00604: error occurred at recursive SQL level 1
ORA-00900: invalid SQL statement
ORA-06512: at line 17*
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
1
0
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

EXEC (или EXECUTE) — это SQL*Plus и связанное с ним клиентское сокращение для анонимного блока. Это не то, что распознается механизмами SQL или PL/SQL.

Измените свой вызов, чтобы использовать вместо него BEGIN/END:

lv_sql := 'BEGIN SYS.DBMS_FGA.add_policy (... statement_types => ''UPDATE,DELETE''); END;';
--         ^^^^^                                                                   ^^^^^^

Я не уверен, почему вы используете здесь динамический SQL, вы можете просто вызвать SYS.DBMS_FGA.add_policy напрямую.

Но в любом случае, из вашей последующей ошибки ORA-04022, похоже, что DBMS_FGA выполняет DDL, требующий блокировки словаря в той же таблице, так что это не сработает. Вам нужно будет пересмотреть свой подход.

Теперь я получаю это: ORA-04022: теперь запрошено ожидание, но пришлось ждать, чтобы заблокировать объект словаря

ashwani Kumar 08.04.2022 16:35

Любое решение, чтобы снять эту блокировку с триггерным блоком.

ashwani Kumar 08.04.2022 16:50

Другие вопросы по теме