【发布时间】:2020-04-18 12:46:36
【问题描述】:
我正在尝试创建一个触发器来记录特定架构(架构 DS)的所有 ddl 更改,并在另一个架构(架构 SD)中更新这些更改。
CREATE OR REPLACE TRIGGER audit_ddl_trg AFTER DDL ON SCHEMA DECLARE
sql_text ora_name_list_t;
v_stmt VARCHAR2(2000);
n PLS_INTEGER;
BEGIN
n := ora_sql_txt(sql_text);
FOR i IN 1..n LOOP v_stmt := v_stmt || sql_text(i);
END LOOP;
v_stmt := regexp_replace(v_stmt, 'rename[[:space:]]+.*[[:space:]]+to[[:space:]]+([a-z0-9_]+)', '\1', 1, 1,
'i');
IF ( ora_sysevent = 'TRUNCATE' ) THEN
NULL;
ELSE
INSERT INTO audit_ddl (
d,
osuser,
current_user,
host,
terminal,
owner,
type,
name,
sysevent,
statements
) VALUES (
sysdate,
sys_context('USERENV', 'OS_USER'),
sys_context('USERENV', 'CURRENT_USER'),
sys_context('USERENV', 'HOST'),
sys_context('USERENV', 'TERMINAL'),
ora_dict_obj_owner,
ora_dict_obj_type,
ora_dict_obj_name,
ora_sysevent,
v_stmt
);
sd.insert_log(sql_text);
END IF;
END;
/
但是,它似乎无法识别该过程。我尝试创建一个数据库链接。但这也行不通。有没有办法解决这个问题?
【问题讨论】:
-
与您在此处给出的答案相同:stackoverflow.com/questions/59517432/…
-
似乎无法识别程序是什么意思?这作为问题描述毫无意义。你看到了什么错误?
-
顺便说一下,可能值得将
audit_ddl的某些列设置为默认值。
标签: oracle plsql ddl database-trigger