Qual é a diferença entre os gatilhos ON SCHEMA e ON DATABASE?

8

Podemos criar o gatilho do banco de dados no evento de esquema concreto (ON SCOTT.SCHEMA) ou em todos os esquemas (ON SCHEMA). No entanto, também podemos usar ON DATABASE ao criar o gatilho do banco de dados. Qual a diferença entre eles? É alguma coisa legada? ON DATABASE deve ser usado ao usar AFTER STARTUP ou AFTER STARTUP, porque definitivamente está relacionado apenas ao banco de dados, mas o mesmo procedimento feito com ON SCHEMA pode ser feito com ON DATABASE, então qual é a diferença? Não consigo encontrar referências nos documentos da Oracle sobre isso.

Centurião
fonte

Respostas:

11

Um acionador on schema(sem esquema especificado) não é acionado para todos os esquemas. Ele é acionado apenas quando a ação de acionamento é executada pelo usuário que possui esse acionador.

Portanto, eles são bem diferentes e não são intercambiáveis.

Aqui está um exemplo que configura uma tabela de log e três creategatilhos:, on databasee on schemapara usuários 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.

Agora vamos criar uma tabela no fooesquema de, como foo:

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

E vamos criar uma tabela no fooesquema de, como bar:

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

Aqui está o que registramos:

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.

Assim:

  • as duas create triggerinstruções foram registradas pelo after create on databasegatilho "global" . Esse gatilho também registrou todo o resto.
  • foo's after create on schemaregistrada a criação tabela que foi feito porfoo
  • barO gatilho do registrou a criação da tabela que foi executada por barele mesmo, mesmo que tenha barcriado uma tabela no fooesquema.
Esteira
fonte