我有下表和触发器。
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)
);
它没有被记录。任何人都知道我的扳机有什么问题?
答案 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
次操作。