Qual è la differenza tra i trigger ON SCHEMA e ON DATABASE?


8

È possibile creare il trigger di database su evento di schema concreto (ON SCOTT.SCHEMA) o su tutti gli schemi (ON SCHEMA). Tuttavia, possiamo anche utilizzare ON DATABASE durante la creazione del trigger di database. Qual'è la differenza tra loro? Sono alcune cose legacy? ON DATABASE dovrebbe essere usato quando si utilizza AFTER STARTUP o AFTER STARTUP perché è sicuramente correlato solo al database ma le stesse cose che si fanno usando ON SCHEMA potrebbero essere fatte usando ON DATABASE, quindi qual è la differenza? Non riesco a trovare riferimenti nei documenti Oracle su questo.

Risposte:


11

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 createtrigger: on databasee on schemaper utenti fooe 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 fooschema di, come foo:

SQL> connect foo/foo
Connected.
SQL> create table foo.foo_stuff (id number);
Table created.

E creiamo una tabella nello fooschema 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 triggerdichiarazioni sono state registrate dal after create on databasetrigger "globale" . Quel trigger ha registrato anche tutto il resto.
  • fooha after create on schemaregistrato la creazione della tabella che è stata eseguita dafoo
  • barIl trigger ha registrato la creazione della tabella eseguita da barlui stesso, anche se ha barcreato una tabella nello fooschema di.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.