具体的なスキーマイベント(ON SCOTT.SCHEMA)またはすべてのスキーマ(ON SCHEMA)でデータベーストリガーを作成できます。ただし、データベーストリガーを作成するときにON DATABASEを使用することもできます。それらの違いは何ですか?レガシーなものですか? ON DATABASEは、AFTER STARTUPまたはAFTER STARTUPを使用する場合に使用する必要があります。これはデータベースのみに明確に関連しているためですが、ON SCHEMAを使用して行われるのと同じことがON DATABASEを使用して行われる場合があるため、違いは何ですか?それについてのOracleのドキュメントで参照を見つけることができません。
トリガー_on schema
_(スキーマが指定されていない)は、すべてのスキーマに対して起動されません。トリガーを所有するユーザーがトリガーアクションを実行したときにのみ発生します。
したがって、それらはまったく異なり、互換性はありません。
ロギングテーブルと3つのcreate
トリガーを設定する例を次に示します。ユーザーfoo
とbar
の_on database
_と_on schema
_:
_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.
_
そう:
create trigger
_ステートメントは、「グローバル」_after create on database
_トリガーによってログに記録されました。そのトリガーは他のすべても記録しました。foo
の_after create on schema
_は、foo
によって行われたテーブル作成をログに記録しましたbar
のトリガーは、bar
がbar
のスキーマにテーブルを作成した場合でも、foo
自身が実行したテーブル作成をログに記録しました。