Sự khác biệt giữa các kích hoạt ON SCHema và ON DATABASE là gì?


8

Chúng tôi có thể tạo trình kích hoạt cơ sở dữ liệu về sự kiện lược đồ cụ thể (ON SCOTT.SCHema) hoặc trên tất cả các lược đồ (ON SCHema). Tuy nhiên, chúng ta cũng có thể sử dụng ON DATABASE khi tạo trình kích hoạt cơ sở dữ liệu. sự khác biệt giữa chúng là gì? Đây có phải là một số công cụ di sản? Nên sử dụng ONABABASE khi sử dụng SAU KHI BẮT ĐẦU hoặc SAU KHI BẮT ĐẦU vì nó chắc chắn chỉ liên quan đến cơ sở dữ liệu nhưng những thứ tương tự được thực hiện khi sử dụng ON SCHema có thể được thực hiện bằng cách sử dụng ON DATABASE, vậy sự khác biệt là gì? Tôi không thể tìm thấy tài liệu tham khảo trong các tài liệu của Oracle về điều đó.

Câu trả lời:


11

Một kích hoạt on schema(không có lược đồ được chỉ định) không kích hoạt cho tất cả các lược đồ. Nó chỉ kích hoạt khi hành động kích hoạt được chạy bởi người dùng sở hữu kích hoạt đó.

Vì vậy, chúng là khá khác nhau, và không thể thay thế cho nhau.

Đây là một ví dụ thiết lập bảng ghi nhật ký và ba createtrình kích hoạt: on databaseon schemacho người dùng foobar:

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.

Bây giờ hãy tạo một bảng trong foolược đồ của, như foo:

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

Và hãy tạo một bảng trong foolược đồ của, như bar:

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

Đây là những gì chúng tôi đã đăng nhập:

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.

Vì thế:

  • hai create triggerbáo cáo đã được after create on databasekích hoạt bởi trình kích hoạt "toàn cầu" . Kích hoạt đó cũng đăng nhập mọi thứ khác.
  • foođã after create on schemađăng nhập việc tạo bảng được thực hiện bởifoo
  • barTrình kích hoạt đã ghi lại việc tạo bảng do barchính anh ta điều hành , mặc dù barđã tạo một bảng trong foolược đồ.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.