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(スキーマが指定されていない)トリガーは、すべてのスキーマに対して起動するわけではありません。トリガーを所有するユーザーがトリガーアクションを実行したときにのみ発生します。

したがって、それらはまったく異なり、互換性はありません。

例はここにそのロギングテーブルアップセット、および3つのcreateトリガ:on databaseと、on schemaユーザー用foobar

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.

そう:

  • 2つのcreate triggerステートメントは、「グローバル」after create on databaseトリガーによってログに記録されました。そのトリガーは他のすべても記録しました。
  • fooさんはafter create on schemaによって行われたテーブルの作成をログに記録しましたfoo
  • barのトリガーは、スキーマにテーブルを作成したbarにもかかわらず、自分で実行したテーブルの作成をログに記録しbarましたfoo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.