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

Hof*_*ann 4 sql oracle triggers plsql

我有下表和触发器。

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;
Run Code Online (Sandbox Code Playgroud)

我想记录在 USER1 架构上发生的每个 DDL 操作(创建/删除表/过程等)。仅当 USER1 执行 DDL 操作时才会执行此触发器,如果​​ USER2 对 USER1 架构执行 DDL 操作,例如:

CREATE TABLE USER1.TEST (
        test varchar2(100)
);
Run Code Online (Sandbox Code Playgroud)

它不会被记录。有人知道我的触发器有什么问题吗?

DCo*_*kie 5

“ON user.schema”子句并不像您想象的那样工作。来自10gR2 SQL 参考:

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

(强调我的)

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

  • +1 语法令人困惑。在大多数情况下,SCHEMA 严格意味着帐户拥有的对象集合,霍夫曼的解释符合这种用法。为了符合实际的实现,语法应该类似于`AFTER DDL BY user1.USER`。 (2认同)