除了Schema所有者之外,其他用户不会触发架构上的Oracle触发器

时间:2009-10-28 21:44:44

标签: sql oracle plsql triggers

我有下表和触发器。

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操作(创建/删除表/过程等)。只有当USER2对USER1模式执行DDL操作时,如果USER1进行DDL操作,则仅执行此触发器:

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

它没有被记录。任何人都知道我的扳机有什么问题?

3 个答案:

答案 0 :(得分:4)

“ON user.schema”子句与您的想法不同。来自10gR2 SQL Reference:

“只要任何连接为架构的用户启动触发事件,触发器就会触发。”

(强调我的)

因此,触发器仅在连接AS USER1时记录DDL问题,而不是在架构USER1上执行DDL时。

答案 1 :(得分:2)

为什么“构建自己的”并且不使用“审核”等标准数据库功能?

答案 2 :(得分: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;

这样就不会记录SYS架构上的USER1次操作。