Quelle est la différence entre les déclencheurs ON SCHEMA et ON DATABASE?

8

Nous pouvons créer le déclencheur de base de données sur un événement de schéma concret (ON SCOTT.SCHEMA) ou sur tous les schémas (ON SCHEMA). Cependant, nous pouvons également utiliser ON DATABASE lors de la création d'un déclencheur de base de données. Quelle est la différence entre eux? Est-ce des trucs hérités? ON DATABASE doit être utilisé lorsque vous utilisez AFTER STARTUP ou AFTER STARTUP car il est définitivement lié uniquement à la base de données, mais la même chose que celle effectuée avec ON SCHEMA peut être effectuée avec ON DATABASE, alors quelle est la différence? Je ne trouve pas de références dans les documents Oracle à ce sujet.

Centurion
la source

Réponses:

11

Un déclencheur on schema(sans schéma spécifié) ne se déclenche pas pour tous les schémas. Il se déclenche uniquement lorsque l'action de déclenchement est exécutée par l'utilisateur propriétaire de ce déclencheur.

Ils sont donc très différents et ne sont pas interchangeables.

Voici un exemple qui configure une table de journalisation et trois createdéclencheurs:, on databaseet on schemapour les utilisateurs fooet 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.

Créons maintenant une table dans foole schéma de, comme foo:

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

Et créons une table dans foole schéma de, comme bar:

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

Voici ce que nous avons enregistré:

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.

Donc:

  • les deux create triggerinstructions ont été enregistrées par le after create on databasedéclencheur "global" . Ce déclencheur a également enregistré tout le reste.
  • fooa after create on schemaenregistré la création de table effectuée parfoo
  • barLe déclencheur a enregistré la création de table exécutée par barlui-même, même s'il a barcréé une table dans foole schéma de.
Tapis
la source