Un déclencheur on schema
(sans schéma spécifié) ne se déclenche pas pour tous les schémas. Il se déclenche uniquement lorsque l'action de déclenchement est exécutée par l'utilisateur propriétaire de ce déclencheur.
Ils sont donc très différents et ne sont pas interchangeables.
Voici un exemple qui configure une table de journalisation et trois create
déclencheurs:, on database
et on schema
pour les utilisateurs foo
et 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.
Créons maintenant une table dans foo
le schéma de, comme foo
:
SQL> connect foo/foo
Connected.
SQL> create table foo.foo_stuff (id number);
Table created.
Et créons une table dans foo
le schéma de, comme bar
:
SQL> connect bar/bar
Connected.
SQL> create table foo.bar_stuff (id number);
Table created.
Voici ce que nous avons enregistré:
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.
Donc:
- les deux
create trigger
instructions ont été enregistrées par le after create on database
déclencheur "global" . Ce déclencheur a également enregistré tout le reste.
foo
a after create on schema
enregistré la création de table effectuée parfoo
bar
Le déclencheur a enregistré la création de table exécutée par bar
lui-même, même s'il a bar
créé une table dans foo
le schéma de.