为啥我不能在 SYS 拥有的对象上创建触发器?
Posted
技术标签:
【中文标题】为啥我不能在 SYS 拥有的对象上创建触发器?【英文标题】:Why cannot I create triggers on objects owned by SYS?为什么我不能在 SYS 拥有的对象上创建触发器? 【发布时间】:2013-02-28 22:01:12 【问题描述】:在尝试创建名为 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
创建的表上创建触发器。
【问题讨论】:
Oracle 不允许您在 SYS 拥有的对象上创建触发器。 在 SYS 模式中创建基于用户的触发器根本不是一个好习惯。为什么不在新模式中创建表、触发器和其他对象? 【参考方案1】:您不应在 SYS 架构中创建 任何 对象。该用户是 Oracle 数据库管理系统的一部分,更改其模式可能会破坏您的数据库。当然,它可能会使您的 Oracle 支持合同无效(如果您有的话)。来自the documentation:
"管理员帐户 SYS 是在以下情况下自动创建的 创建数据库。此帐户可以执行所有数据库 行政职能。 SYS 模式存储基表和 数据字典的视图。这些基表和视图是 对 Oracle 数据库的运行至关重要。 SYS 中的表 模式仅由数据库操作,绝不能修改 任何用户。”
哦,如果您想知道,这同样适用于 SYSTEM。
触发器特别容易被滥用,并且是扩展问题的主要来源。这就是 Oracle 禁止我们在 SYS 中构建触发器的原因,因为这样做可能会损坏或至少影响数据字典的性能。
当然,这不是这里发生的事情。您已经在 SYS 中构建了自己的表。好吧,放下它们。现在。使用 SYS 创建您自己的用户、GHAZAL 或任何适合的名称,并授予它所需的权限:CREATE SESSION、CREATE TABLE、CREATE TRIGGER 等等。然后以该新用户的身份连接以创建您的表和其他架构对象。
【讨论】:
以上是关于为啥我不能在 SYS 拥有的对象上创建触发器?的主要内容,如果未能解决你的问题,请参考以下文章