В чем разница между триггерами ON SCHEMA и ON DATABASE?

8

Мы можем создать триггер базы данных для конкретного события схемы (ON SCOTT.SCHEMA) или для всех схем (ON SCHEMA). Однако мы также можем использовать ON DATABASE при создании триггера базы данных. В чем разница между ними? Это какие-то старые вещи? ON DATABASE следует использовать при использовании AFTER STARTUP или AFTER STARTUP, потому что это определенно связано только с базой данных, но то же самое, что делается с помощью ON SCHEMA, может быть сделано с использованием ON DATABASE, так в чем же разница? Я не могу найти ссылки в документации Oracle по этому поводу.

центурион
источник

Ответы:

11

Триггер on schema(без указания схемы) не срабатывает для всех схем. Он срабатывает только тогда, когда запускающее действие запускается пользователем, которому принадлежит этот триггер.

Так что они совершенно разные и не взаимозаменяемы.

Вот пример, который устанавливает таблицу журналов и три createтриггера: on databaseи on schemaдля пользователей fooи 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.

Теперь давайте создадим таблицу в fooроссийской схеме foo:

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

И давайте создадим таблицу в fooроссийской схеме, как bar:

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

Вот что мы вошли в систему:

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.

Так:

  • эти два create triggerоператора были зарегистрированы "глобальным" after create on databaseтриггером. Этот триггер также записал все остальное.
  • foo«s after create on schemaвошел создание таблицы, было сделаноfoo
  • barТриггер регистрировал создание таблицы, которое было выполнено им barсамим, даже несмотря на то, что barсоздал таблицу в fooсхеме.
Мат
источник