During the trigger execution getting error : ORA-00604: error occurred at recursive SQL level 1 ORA-00900: invalid SQL statement
During the trigger execution getting error : ORA-00604: error occurred at recursive SQL level 1 ORA-00900: invalid SQL statement
当我尝试执行此触发器时出现以下错误:
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 行
触发器的用途:每当用户创建 table 之后,应为此 table 启用审核。
执行错误消息:
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*
EXEC
(或EXECUTE
)是SQL*Plus 和相关客户端shorthand 的匿名块。 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,这需要在同一 table 上进行字典锁定,因此这不会起作用.您需要重新考虑您的方法。
当我尝试执行此触发器时出现以下错误:
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 行
触发器的用途:每当用户创建 table 之后,应为此 table 启用审核。
执行错误消息:
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*
EXEC
(或EXECUTE
)是SQL*Plus 和相关客户端shorthand 的匿名块。 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,这需要在同一 table 上进行字典锁定,因此这不会起作用.您需要重新考虑您的方法。