【发布时间】:2023-03-29 00:04:01
【问题描述】:
我有一个系统事件触发器。在我尝试将代码移动到不同的数据库之前,它运行良好。 我犯了一个错误:忘记导出原始用户,所以我创建了一个全新的。
所以在我发布我的代码后,我得到了错误:
TRIGGER ORACLE_VERSION_CONTROLLER.TRG_CATCH_AFTER_DDL 的编译错误
错误:PLS-00201:必须声明标识符“ORA_SQL_TXT” 线路:24 文本:n := ora_sql_txt(sql_text);
错误:PL/SQL:语句被忽略 线路:24 文本:n := ora_sql_txt(sql_text);
有人有想法吗?
CREATE OR REPLACE TRIGGER trg_catch_after_ddl
AFTER DDL ON DATABASE
DECLARE
sql_text ora_name_list_t;
n pls_integer;
v_sql CLOB;
v_id NUMBER;
BEGIN
dbms_output.put_line(ora_sysevent);
IF ora_sysevent IN ('DROP', 'ALTER', 'ANALYZE') THEN
/*alter table must be handle*/
NULL; -- this is not finished
ELSE
IF ora_dict_obj_type = 'TABLE' THEN
v_sql := dbms_metadata.get_ddl(ora_dict_obj_type,
ora_dict_obj_name,
ora_login_user);
ELSE
n := ora_sql_txt(sql_text);
FOR i IN 1 .. n LOOP
v_sql := v_sql || sql_text(i);
END LOOP;
END IF;
INSERT INTO audit_log
(user_name, dll_type, object_name, object_type, object_script)
VALUES
(ora_login_user,
ora_sysevent,
ora_dict_obj_name,
ora_dict_obj_type,
v_sql)
RETURNING log_id INTO v_id;
pcd_source_writer(id => v_id);
END IF;
END trg_catch_after_ddl;
【问题讨论】:
-
函数
ora_sql_txt是否存在? -
是的,我找到了解决方案。解决方案是该函数需要在sys用户下并赋予执行权限。
标签: oracle plsql database-trigger