我们可以在具体模式事件 (ON SCOTT.SCHEMA) 或所有模式 (ON SCHEMA) 上创建数据库触发器。但是,我们也可以在创建数据库触发器时使用 ON DATABASE。它们之间有什么区别?这是一些遗留的东西吗?在使用 AFTER STARTUP 或 AFTER STARTUP 时应该使用 ON DATABASE,因为它肯定只与数据库相关,但使用 ON SCHEMA 完成的相同工作可能会使用 ON DATABASE 完成,那么有什么区别呢?我在 Oracle 文档中找不到关于此的参考。
Mat*_*Mat 11
触发器on schema
(未指定架构)不会为所有架构触发。它仅在触发操作由拥有该触发器的用户运行时触发。
所以它们是完全不同的,不能互换。
这是一个设置日志记录表和三个create
触发器的示例:on database
, 以及on schema
用户foo
和bar
:
Connected. -- as mat
SQL> create table mat.log (dt timestamp, who varchar(3),
2 cur varchar(10), own varchar(42), obj varchar(42));
Table created.
SQL> create or replace trigger db_trig
2 after create on database
3 begin
4 insert into mat.log values (systimestamp, 'db', user,
5 ORA_DICT_OBJ_OWNER, ORA_DICT_OBJ_NAME);
6 end;
7 /
Trigger created.
SQL> connect foo/foo
Connected.
SQL> create or replace trigger foo_trig
2 after create on schema
3 begin
4 insert into mat.log values (systimestamp, 'foo', user,
5 ORA_DICT_OBJ_OWNER, ORA_DICT_OBJ_NAME);
6 end;
7 /
Trigger created.
SQL> connect bar/bar
Connected.
SQL> create or replace trigger bar_trig
2 after create on schema
3 begin
4 insert into mat.log values (systimestamp, 'bar', user,
5 ORA_DICT_OBJ_OWNER, ORA_DICT_OBJ_NAME);
6 end;
7 /
Trigger created.
Run Code Online (Sandbox Code Playgroud)
现在让我们在foo
的架构中创建一个表,如下所示foo
:
SQL> connect foo/foo
Connected.
SQL> create table foo.foo_stuff (id number);
Table created.
Run Code Online (Sandbox Code Playgroud)
让我们在foo
的架构中创建一个表,如下所示bar
:
SQL> connect bar/bar
Connected.
SQL> create table foo.bar_stuff (id number);
Table created.
Run Code Online (Sandbox Code Playgroud)
这是我们记录的内容:
SQL> select * from mat.log order by dt;
DT WHO CUR OWN OBJ
------------------------------ --- ---------- ---------- ---------------
25-NOV-12 07.52.03.797794 PM db FOO FOO FOO_TRIG
25-NOV-12 07.52.03.828670 PM db BAR BAR BAR_TRIG
25-NOV-12 07.52.03.865334 PM foo FOO FOO FOO_STUFF
25-NOV-12 07.52.03.865579 PM db FOO FOO FOO_STUFF
25-NOV-12 07.52.03.894672 PM bar BAR FOO BAR_STUFF
25-NOV-12 07.52.03.894911 PM db BAR FOO BAR_STUFF
6 rows selected.
Run Code Online (Sandbox Code Playgroud)
所以:
create trigger
语句由“全局”after create on database
触发器记录。该触发器还记录了其他所有内容。foo
的after create on schema
记录,是由完成表的创建foo
bar
的触发器记录了bar
他自己运行的表创建,即使bar
在foo
的模式中创建了一个表。