我正在尝试为Oracle实现伪版本控制和存储库。其思想是:当更改存储函数/过程或创建全局DATABASE时触发触发器,它将获取修改对象的当前源并存储它们到一张桌子旁。所以我用了两个触发器:
TRIGGER BEFORE_MODIFY before ALTER or CREATE ON DATABASE
TRIGGER AFTER_MODIFY after ALTER or CREATE ON DATABASE
一切正常,除了AFTER_MODIFY触发器看到的是编译对象的旧版本(源代码)。我曾试图从SYS.SOURCE$.SOURCE
获得来源,并作为dbms_metadata.get_ddl(OBJ_TYPE, OBJ_NAME, OBJ_OWNER)
的第二次尝试,结果相同。
我正在寻找建议或明确的答案,如"你不能在Oracle 10g+中做到这一点"。
建议使用ora_sql_txt获取新代码:
create or replace TRIGGER AFTER_MODIFY after CREATE ON hr.SCHEMA
declare
sql_text ora_name_list_t;
n number;
begin
n := ora_sql_txt(sql_text);
FOR i IN 1..n LOOP
dbms_output.put_line(sql_text(i));
END LOOP;
end;
/