¿Cuál es la diferencia entre los activadores ON SCHEMA y ON DATABASE?

8

Podemos crear el desencadenador de la base de datos en un evento de esquema concreto (EN SCOTT.SCHEMA) o en todos los esquemas (EN ESQUEMA). Sin embargo, también podemos usar ON DATABASE al crear un desencadenador de base de datos. ¿Cuál es la diferencia entre ellos? ¿Es algo de legado? ON DATABASE se debe usar cuando se usa DESPUÉS DEL ARRANQUE o DESPUÉS DEL ARRANQUE porque definitivamente está relacionado solo con la base de datos, pero las mismas cosas que se hacen con ON SCHEMA podrían hacerse con ON DATABASE, entonces, ¿cuál es la diferencia? No puedo encontrar referencias en los documentos de Oracle sobre eso.

Centurion
fuente

Respuestas:

11

Un disparador on schema(sin esquema especificado) no se dispara para todos los esquemas. Solo se dispara cuando el usuario propietario de ese disparador ejecuta la acción de activación.

Por lo tanto, son bastante diferentes y no son intercambiables.

Aquí hay un ejemplo que configura una tabla de registro y tres createdesencadenantes: on databasey on schemapara usuarios fooy 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.

Ahora creemos una tabla en fooel esquema de, como foo:

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

Y creemos una tabla en fooel esquema de, como bar:

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

Esto es lo que hemos registrado:

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.

Entonces:

  • las dos create triggerdeclaraciones fueron registradas por el after create on databasedisparador "global" . Ese disparador también registró todo lo demás.
  • fooha after create on schemaregistrado la creación de la tabla realizada porfoo
  • barEl desencadenador registró la creación de la tabla que ejecutó barél mismo, aunque barcreó una tabla en fooel esquema.
Estera
fuente