尝试创建名为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
创建的表上创建触发器。
答案 0 :(得分:10)
您不应该在SYS架构中创建任何对象。该用户是Oracle数据库管理系统的一部分,使用它可能会破坏您的数据库。来自the documentation:
“管理帐户SYS是在a时自动创建的 数据库已创建。此帐户可以执行所有数据库 行政职能。 SYS模式存储基表和 数据字典的视图。这些基表和视图是 对Oracle数据库的操作至关重要。 SYS中的表 schema仅由数据库操作,绝不能修改 任何用户。“
哦,如果您想知道,同样适用于SYSTEM。
触发器特别容易被滥用,并且是缩放问题的主要来源。这就是为什么Oracle禁止我们在SYS中构建触发器,因为这样做可能会破坏或至少影响数据字典的性能。
当然,这不是这里发生的事情。您已在SYS中构建自己的表。好吧放下它们。现在。使用SYS创建您自己的用户,GHAZAL或其他任何内容并授予它所需的权限。然后以新用户身份连接以创建表和模式。