Apa perbedaan antara pemicu ON SCHEMA dan ON DATABASE?


8

Kami dapat membuat pemicu basis data pada acara skema konkret (ON SCOTT.SCHEMA) atau di semua skema (ON SCHEMA). Namun, kita juga bisa menggunakan ON DATABASE saat membuat pemicu basis data. Apa perbedaan di antara mereka? Apakah ini barang warisan? ON DATABASE harus digunakan ketika menggunakan SETELAH STARTUP atau SETELAH STARTUP karena itu pasti hanya terkait dengan basis data tetapi hal yang sama yang dilakukan menggunakan ON SCHEMA mungkin dilakukan menggunakan ON DATABASE, jadi apa bedanya? Saya tidak dapat menemukan referensi di Oracle docs tentang itu.

Jawaban:


11

Pemicu on schema(tanpa skema yang ditentukan) tidak menyala untuk semua skema. Ini hanya menyala saat aksi pemicu dijalankan oleh pengguna yang memiliki pemicu itu.

Jadi mereka sangat berbeda, dan tidak dapat dipertukarkan.

Berikut adalah contoh yang menyiapkan tabel pencatatan, dan tiga createpemicu:, on databasedan on schemauntuk pengguna foodan 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.

Sekarang mari kita buat tabel dalam fooskema, sebagai foo:

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

Dan mari kita buat tabel dalam fooskema, seperti bar:

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

Inilah yang kami login:

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.

Begitu:

  • dua create triggerpernyataan dicatat oleh after create on databasepemicu "global" . Pemicu itu juga mencatat semuanya.
  • foo's after create on schemalogin penciptaan meja yang dilakukan olehfoo
  • barPemicu mencatat pembuatan tabel yang dijalankan oleh bardirinya sendiri, meskipun barmembuat tabel dalam fooskema.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.