Was ist der Unterschied zwischen ON SCHEMA- und ON DATABASE-Triggern?

8

Wir können den Datenbank-Trigger für ein konkretes Schemaereignis (ON SCOTT.SCHEMA) oder für alle Schemas (ON SCHEMA) erstellen. Wir können jedoch auch ON DATABASE verwenden, wenn wir einen Datenbank-Trigger erstellen. Was ist der Unterschied zwischen ihnen? Ist es ein Vermächtnis? ON DATABASE sollte verwendet werden, wenn AFTER STARTUP oder AFTER STARTUP verwendet wird, da es definitiv nur mit der Datenbank zusammenhängt, aber das gleiche, was mit ON SCHEMA gemacht wird, kann mit ON DATABASE gemacht werden. Was ist also der Unterschied? Ich kann in Oracle-Dokumenten keine Referenzen dazu finden.

Zenturio
quelle

Antworten:

11

Ein Trigger on schema(ohne angegebenes Schema) wird nicht für alle Schemas ausgelöst . Es wird nur ausgelöst, wenn die auslösende Aktion von dem Benutzer ausgeführt wird, dem dieser Auslöser gehört.

Sie sind also ganz anders und nicht austauschbar.

Hier ist ein Beispiel, das eine Protokollierungstabelle und drei createTrigger erstellt: on databaseund on schemafür Benutzer foound 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.

Erstellen wir nun eine Tabelle im fooSchema wie folgt foo:

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

Und erstellen wir eine Tabelle im fooSchema wie folgt bar:

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

Folgendes haben wir protokolliert:

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.

Damit:

  • Die beiden create triggerAnweisungen wurden vom "globalen" after create on databaseTrigger protokolliert . Dieser Auslöser protokollierte auch alles andere.
  • foo‚s after create on schemaprotokolliert die Erstellung von Tabellen , die getan wurde vonfoo
  • bar's Trigger protokollierte die Tabellenerstellung, die von ihm barselbst ausgeführt wurde, obwohl bareine Tabelle im fooSchema erstellt wurde.
Matte
quelle