after oracle alter,关于数据库级ALTER的触发器
觸發器如下,功能就是把更改對象的DDL語句保存到表里(包括DROP).
CREATE OR REPLACE TRIGGER TRI_ALTE_OBJECT
AFTER DDL ON database
--將DROP掉的對象創建語句保存到文件
declare
v_owner??varchar2(50);
V_SOURCE CLOB;
I? ?? ???INTEGER;
BEGIN
DBMS_OUTPUT.put_line(ORA_SYSEVENT);
IF UPPER(ORA_SYSEVENT) = 'ALTER' AND UPPER(ORA_SYSEVENT) <> 'DROP' THEN--防止重復執行觸發器,DROP好像也屬于ALTER。
DBMS_OUTPUT.put_line(ora_dict_obj_type);
DBMS_OUTPUT.put_line(ora_dict_obj_name);
DBMS_OUTPUT.put_line(ora_dict_obj_owner);
SELECT dbms_metadata.get_ddl(ora_dict_obj_type,
ora_dict_obj_name,
ora_dict_obj_owner)
INTO V_SOURCE
FROM dual;
insert into VERSION_CONTROL
values
(ora_dict_obj_owner, ORA_LOGIN_USER, SYSDATE, V_SOURCE);
end if;
end;
/
但是發現了一個問題,由于是AFTER 觸發器,我刪除一個表的時候,如果該表上有索引的話,會出現錯誤,錯誤信息如下:
--這里我刪除的是測試表hehe
14:05:47 SCOTT@orcl> drop table hehe;
ALTER
TABLE
HEHE
SCOTT
ALTER
INDEX
SYS_C0012714
SCOTT
drop table hehe
*
第 1 行出現錯誤:
ORA-00604: 遞歸 SQL 級別 2 出現錯誤
ORA-31603: 對象 "SYS_C0012714" 屬于類型 INDEX, 在方案 "SCOTT" 中未找到
ORA-06512: 在 "SYS.DBMS_SYS_ERROR", line 105
ORA-06512: 在 "SYS.DBMS_METADATA", line 3912
ORA-06512: 在 "SYS.DBMS_METADATA", line 5678
ORA-06512: 在 line 1
ORA-06512: 在 line 28
據我分析,應該是刪除了表,所以表上的索引已經沒有了,所以找不到.
然后我又改為了前置觸發器(BEFORE),執行刪除,這會沒報錯,但是根據打印出的信息又發現一個問題:
14:06:41 SCOTT@orcl> drop table hehe;
DROP
ALTER
TABLE
HEHE
SCOTT
ALTER
INDEX
SYS_C0012714
SCOTT
ALTER
TABLE
HEHE
SCOTT
表已刪除。
--可以看到開始執行的操作是DROP,后面又是ALTER表HEHE,然后是ALTER表上的索引SYS_C0012714(這里我成功保存了索引的創建信息),但是最后又出來一個ALTER表HEHE,這樣我就重復記錄了一次表HEHE的創建信息.
請問大神有沒有研究過這個的,指導一下吧?
總結
以上是生活随笔為你收集整理的after oracle alter,关于数据库级ALTER的触发器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle imp字符集转换,imp/
- 下一篇: swoole不是php,Swoole