2016-04-20 10 views
0

私は、オブジェクトがスキーマに作成され、誰によって作成されたかという情報を記録する1つの監査テーブルを作成しました。DDL Trigger Oracle

[email protected]> create table create_audit 
    2 (created_Date date, 
    3 object_type varchar2(30), 
    4 object_name varchar2(30), 
    5 created_by varchar2(20)); 

これは、私が作成したトリガーです:

1  create or replace trigger create_trg_audit 
    2  after create on schema 
    3  begin 
    4  insert into create_audit values 
    5  (sysdate, ora_dict_obj_typ, ora_dict_obj_name , ora_dict_obj_owner); 
    6* end create_trg_audit; 

このDDLトリガを作成しながら、私はエラーの下に受けています:

[email protected]> show error 
Errors for TRIGGER CREATE_TRG_AUDIT: 

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
2/5  PL/SQL: SQL Statement ignored 
3/16  PL/SQL: ORA-00984: column not allowed here 

は、我々は、挿入コマンドを与えることはできませんDDLトリガで?

[email protected]> select object_type, object_name ,owner from all_objects where last_ddl_time > sysdate-10; 

答えて

1

あなただけのタイプミスを持っています。あなたの挿入物は(有効な)ora_dict_obj_typeの代わりにora_dict_obj_typを参照しているので、最後の'e'が欠落しています。 event attribute functionsのマニュアルには有効な値が記載されており、insertvalues()句で使用されていることも示されています。

create or replace trigger create_trg_audit 
after create on schema 
begin 
    insert into create_audit (created_date, object_type, object_name, created_by) 
    values (sysdate, ora_dict_obj_type, ora_dict_obj_name, ora_dict_obj_owner); 
end create_trg_audit; 
/

Trigger CREATE_TRG_AUDIT compiled 

show errors 

No errors. 

をそして、あなたは何を望むかを行います:

create table t42 (id number); 

Table T42 created. 

select * from create_audit; 

CREATED_DATE OBJECT_TYPE   OBJECT_NAME   CREATED_BY  
------------ -------------------- -------------------- --------------- 
2016-04-20 TABLE    T42     MYUSER  
+0

ありがとうアレックス。今は私にはっきりしている。 – Wolfgang

1

insert文の一部として使用すると、挿入しようとしている値は未定義です。次のようにdualからそれらをプルする代わりにinsert..selectステートメントを使用します。

create or replace trigger create_trg_audit 
after create on schema 
begin 
insert into create_audit select sysdate, ora_dict_obj_type, ora_dict_obj_name, ora_dict_obj_owner from dual; 
end create_trg_audit; 
+0

は、それが魅力のように動作しますが、なぜ彼らは私がこのことを理解していなかったそのイベント属性関数名を持つ

は、あなたの作成したトリガ文が機能修正しましたinsert文の一部として使用すると、未定義です。 – Wolfgang

+1

これは当てはまりません。 'ora_dict_ *'参照は[イベント属性関数](http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/triggers.htm#LNPLS794)であり、 'sysdate'も関数です。 PL/SQLコンテキストまたは 'values()'節でそれらのいずれかを参照できます。あなたが示したものはもちろん動作しますが、 'select from dual'は必要ありません。 –

+0

あなたは正しいです。私はタイプミスに気付かなかった。 – Spade