Un trigger on schema
(senza schema specificato) non viene attivato per tutti gli schemi. Si attiva solo quando l'azione di trigger viene eseguita dall'utente che possiede quel trigger.
Quindi sono abbastanza diversi e non sono intercambiabili.
Ecco un esempio che imposta una tabella di registrazione e tre create
trigger: on database
e on schema
per utenti foo
e 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.
Ora creiamo una tabella nello foo
schema di, come foo
:
SQL> connect foo/foo
Connected.
SQL> create table foo.foo_stuff (id number);
Table created.
E creiamo una tabella nello foo
schema di, come bar
:
SQL> connect bar/bar
Connected.
SQL> create table foo.bar_stuff (id number);
Table created.
Ecco cosa abbiamo registrato:
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.
Così:
- le due
create trigger
dichiarazioni sono state registrate dal after create on database
trigger "globale" . Quel trigger ha registrato anche tutto il resto.
foo
ha after create on schema
registrato la creazione della tabella che è stata eseguita dafoo
bar
Il trigger ha registrato la creazione della tabella eseguita da bar
lui stesso, anche se ha bar
creato una tabella nello foo
schema di.