为啥我不能在 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_currentghazal_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 拥有的对象上创建触发器?的主要内容,如果未能解决你的问题,请参考以下文章

ORA-04089: 无法对 SYS 拥有的对象创建触发器

创建触发器,对象名无效

全局变量/淡出未触发

为啥我在SQL数据库中创建触发器时,总是说对象名无效?

Oracle 中的审计

Android MVVM - 如何让 LiveData 发出它拥有的数据(强制触发观察者)