2013-03-13 2 views
7

SYSが所有するオブジェクトに対してトリガーを作成できないのはなぜですか? <code>ghazal_current_bef_upd_row</code>という名前のトリガーを作成しようとしているときに

create trigger ghazal_current_bef_upd_row 
before update on ghazal_current 
for each row 
when (new.Rating < old.Rating) 
begin 

insert into ghazal_current_audit 
(GhazalName,Old_Rating,New_Rating) 
values 
(:old.GhazalName,:old.Rating,:new.Rating); 
end; 

私は次のエラーを取得する:

Error report: 
ORA-04089: cannot create triggers on objects owned by SYS 
04089. 00000 - "cannot create triggers on objects owned by SYS" 
*Cause: An attempt was made to create a trigger on an object owned by SYS. 
*Action: Do not create triggers on objects owned by SYS. 

ghazals_currentghazal_current_auditという名前のテーブルがSYSによって作成された両方。 SYSによって作成されたテーブルにトリガーを作成できないのはなぜですか?

+0

Oracleでは、SYSが所有するオブジェクトに対してトリガーを作成することはできません。 –

+1

SYSスキーマでユーザーベースのトリガーを作成することは、まったく推奨されていません。新しいスキーマにテーブル、トリガ、その他のオブジェクトを作成しないでください。 – user75ponic

答えて

9

のオブジェクトをSYSスキーマに作成しないでください。そのユーザーはOracleデータベース管理システムの一部です。そのツールを使用すると、データベースを破壊する可能性が高くなります。 データベースが作成されたときにSYSが自動的に作成される「管理者アカウント

このアカウントは、すべてのデータベース 管理機能SYSスキーマ店ベーステーブルおよびデータ・ディクショナリの ビューを実行することができ、これら:the documentationから。。。 SYS スキーマ内の表はデータベースによってのみ操作され、任意のユーザーが を変更してはなりません。

あなたが疑問に思っている場合は、SYSTEMでも同じことが言えます。

トリガは特に悪用されやすく、スケーリングの問題の大きな原因です。そのため、SYSでトリガーを作成することは禁じられています。これは、データ・ディクショナリーのパフォーマンスが壊れたり、少なくともパフォーマンスに影響を与える可能性があるからです。

もちろん、ここで起こっていることではありません。 SYSに独自のテーブルを作成しました。さて、それらをドロップします。今。 SYSを使用して、独自のユーザー、GHAZALなどを作成し、必要な権限を付与します。次に、新しいユーザーとして接続して、テーブルとスキーマを作成します。

+0

私はあなたを理解していません –

関連する問題