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之后的。同意。我花了一段时间自己通过实验找到了答案,然后重新阅读了文档。感谢您的回复,但是我如何才能触发我想要的呢?=)家庭作业,我必须按照教授的要求做。任务是关于触发器,而不是数据库工具。