10

という名前のトリガーを作成しようとしているときghazal_current_bef_upd_row:

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_currentおよびという名前のテーブルは両方ともghazal_current_auditによって作成されましたSYS。によって作成されたテーブルにトリガーを作成できないのはなぜですかSYS

4

1 に答える 1

11

SYS スキーマにオブジェクトを作成しないでください。そのユーザーは Oracle データベース管理システムの一部であり、そのスキーマを変更するとデータベースが破損する可能性があります。確かに、Oracle サポート契約が無効になる可能性があります (契約がある場合)。ドキュメントから:

「管理アカウント SYS は、データベースの作成時に自動的に作成されます。このアカウントは、すべてのデータベース管理機能を実行できます。SYS スキーマには、データ ディクショナリのベース テーブルとビューが格納されます。これらのベース テーブルとビューは、Oracle Database の操作にとって重要です。 .SYS スキーマ内のテーブルは、データベースによってのみ操作され、ユーザーによって変更されてはなりません。"

ご参考までに、同じことが SYSTEM にも当てはまります。

トリガーは特に悪用されやすく、スケーリングの問題の主な原因です。Oracle が SYS でトリガーを作成することを禁止している理由は、データ ディクショナリが破損するか、少なくともパフォーマンスに影響を与える可能性があるためです。

もちろん、それはここで起こっていることではありません。SYS に独自のテーブルを作成しました。それらを落としてください。今。SYS を使用して独自のユーザー、GHAZAL、または適切な名前を作成し、必要な権限 (CREATE SESSION、CREATE TABLE、CREATE TRIGGER など) を付与します。次に、その新しいユーザーとして接続して、テーブルやその他のスキーマ オブジェクトを作成します。

于 2013-03-13T05:02:11.347 に答える