为什么我不能在SYS拥有的对象上创建触发器?

时间:2013-03-13 04:54:28

标签: oracle plsql triggers oracle11g

尝试创建名为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_currentghazal_current_audit的表格均由SYS创建。为什么我不能在SYS创建的表上创建触发器。

1 个答案:

答案 0 :(得分:10)

您不应该在SYS架构中创建任何对象。该用户是Oracle数据库管理系统的一部分,使用它可能会破坏您的数据库。来自the documentation

  

“管理帐户SYS是在a时自动创建的   数据库已创建。此帐户可以执行所有数据库   行政职能。 SYS模式存储基表和   数据字典的视图。这些基表和视图是   对Oracle数据库的操作至关重要。 SYS中的表   schema仅由数据库操作,绝不能修改   任何用户。“

哦,如果您想知道,同样适用于SYSTEM。

触发器特别容易被滥用,并且是缩放问题的主要来源。这就是为什么Oracle禁止我们在SYS中构建触发器,因为这样做可能会破坏或至少影响数据字典的性能。

当然,这不是这里发生的事情。您已在SYS中构建自己的表。好吧放下它们。现在。使用SYS创建您自己的用户,GHAZAL或其他任何内容并授予它所需的权限。然后以新用户身份连接以创建表和模式。