2009-10-28 17 views
2

我有下表和觸發器。Oracle架構觸發不被架構所有者以外的其他用戶觸發

CREATE TABLE LogSchema (
    user varchar2(100), 
    date_ date, 
    operation varchar2(100), 
    obj_type varchar2(100), 
    obj_name varchar2(100) 
); 

CREATE OR REPLACE TRIGGER LogSchema 
AFTER DDL ON USER1.SCHEMA 
/* can't use ON DATABASE or else it will log 
    everything that happens on all schemas*/ 
DECLARE 
BEGIN 
    INSERT INTO LogSchema VALUES 
    (USER 
     , SYSDATE 
     , sys.sysevent 
     , sys.dictionary_obj_type 
     , sys.dictionary_obj_name); 

END LogSchema; 

我想記錄發生在USER1架構上的每個DDL動作(創建/刪除表/程序等)。

CREATE TABLE USER1.TEST (
     test varchar2(100) 
); 

它不會記錄:如果USER1使一個DDL操作,如果用戶2使得上USER1模式像一個DDL操作將只執行該觸發器。任何人都知道我的觸發器有什麼問題?

回答

4

「ON user.schema」子句不符合您的想法。來自10gR2 SQL Reference:

「只要任何用戶連接爲架構啓動觸發事件,觸發器就會觸發。」

(重點煤礦)

因此,觸發僅在連接AS USER1,而不是當DDL是在架構USER1進行記錄DDL問題。

+2

+1語法混亂。在大多數情況下,SCHEMA嚴格意味着收集一個賬戶擁有的對象,霍夫曼的解釋適合這種用法。爲了符合實際的實現,語法應該像'AFTER DDL BY user1.USER'。 – APC 2009-10-29 02:17:00

+1

同意。我花了一段時間才通過實驗找出自己,然後重新閱讀文檔。 – DCookie 2009-10-29 02:35:12

+0

感謝您的迴應,但我該如何製作觸發器以達到我想要的效果? =) – Hoffmann 2009-11-06 06:22:27

2

爲什麼你「建立自己的」而不使用標準數據庫功能,如「審計」?

+0

家庭作業的任務,我必須做教授的方式問。這個任務是關於觸發器的,而不是數據庫工具。 – Hoffmann 2009-11-06 06:21:03

1

你需要創建一個數據庫觸發器,檢查裏面是否變化的目標位於USER1模式:

CREATE OR REPLACE TRIGGER LogSchemaUSER1 
AFTER DDL ON DATABASE 
DECLARE 
BEGIN 
    IF ora_dict_obj_owner = 'USER1' THEN 
    INSERT INTO USER1.LogSchema VALUES 
     (USER 
     , SYSDATE 
     , ora_sysevent 
     , ora_dict_obj_type 
     , ora_dict_obj_name); 
    END IF; 
END LogSchemaUSER1; 

這種方式只SYSUSER1架構操作將不被記錄。

相關問題