web-dev-qa-db-fra.com

Quelle est la différence entre le schéma et sur les déclencheurs de base de données?

Nous pouvons créer le déclencheur de base de données sur l'événement de schéma de béton (sur Scott.schema) ou sur tous les schémas (sur Schema). Cependant, nous pouvons également utiliser sur la base de données lors de la création de la gâchette de base de données. Quelle est la différence entre eux? Est-ce un peu de choses héritées? Sur la base de données doit être utilisé lors de l'utilisation après le démarrage ou après le démarrage, car il est définitivement associé uniquement à la base de données, mais les mêmes trucs effectués à l'aide de Schema peuvent être effectués sur la base de données, alors quelle est la différence? Je ne trouve pas de références dans Oracle Docs à ce sujet.

8
Centurion

Un déclencheur on schema (sans schéma spécifié) ne tire pas pour tous les schémas. Il ne tire que lorsque l'action de déclenchement est exécutée par l'utilisateur qui possède cette gâchette.

Donc, ils sont assez différents et ne sont pas interchangeables.

Voici un exemple qui établit une table de journalisation et trois create déclenchers: on database, et on schema pour les utilisateurs foo et 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.

Maintenant, créons une table dans foo s schéma, comme foo:

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

Et créons une table dans foo s schéma, 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.

Alors:

  • les deux create trigger Les déclarations ont été enregistrées par le "Global" after create on database gâchette. Ce déclencheur a également enregistré tout le reste.
  • foo 's after create on schema Création de la création de table qui a été effectuée par foo
  • bar 'S déclencheur a enregistré la création de table qui a été exécutée par bar lui-même, même si bar crée une table dans foo schéma.
11
Mat