Sql 架构上的Oracle触发器未由架构所有者以外的其他用户触发

Sql 架构上的Oracle触发器未由架构所有者以外的其他用户触发,sql,oracle,plsql,triggers,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

我有下表和触发器

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操作(创建/删除表/过程等)。仅当USER1执行DDL操作时,才会执行此触发器,如果USER2对USER1架构执行DDL操作,如:

CREATE TABLE USER1.TEST (
        test varchar2(100)
);
它不会被记录下来。有人知道我的触发器出了什么问题吗?

ON user.schema”子句的工作方式与您想象的不太一样。从

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

(强调矿山)


因此,当作为USER1连接时,触发器只记录DDL问题,而不是在模式USER1上执行DDL时。

为什么要“构建自己的”而不使用标准数据库功能,如“审核”?

您需要创建一个数据库触发器,并检查内部更改的对象是否位于
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
架构的操作。

+1语法混乱。在大多数情况下,模式严格意义上是指帐户拥有的对象集合,霍夫曼的解释符合这种用法。为了符合实际的实现,语法应该类似于user1.USER在DDL之后的
。同意。我花了一段时间自己通过实验找到了答案,然后重新阅读了文档。感谢您的回复,但是我如何才能触发我想要的呢?=)家庭作业,我必须按照教授的要求做。任务是关于触发器,而不是数据库工具。