在尝试创建名为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创建的表上创建触发器.
您不应该在SYS模式中创建任何对象.该用户是Oracle数据库管理系统的一部分,使用它可能会破坏您的数据库.从
the documentation开始:
“The administrative account SYS is automatically created when a
database is created. This account can perform all database
administrative functions. The SYS schema stores the base tables and
views for the data dictionary. These base tables and views are
critical for the operation of Oracle Database. Tables in the SYS
schema are manipulated only by the database and must never be modified
by any user.”
哦,万一你想知道,同样适用于SYSTEM.
触发器特别容易被滥用,并且是缩放问题的主要来源.这就是为什么Oracle禁止我们在SYS中构建触发器的原因,因为这样做可能会破坏或至少影响数据字典的性能.
当然,这不是这里发生的事情.您已在SYS中构建自己的表.好吧放下它们.现在.使用SYS创建您自己的用户,GHAZAL或其他任何内容并授予它所需的权限.然后以新用户身份连接以创建表和模式.