10

在尝试创建名为的触发器时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.

4

1 回答 1

11

您不应该在 SYS 模式中创建任何对象。该用户是 Oracle 数据库管理系统的一部分,更改其模式可能会破坏您的数据库。当然,它可能会使您的 Oracle 支持合同无效(如果您有的话)。从文档中

“创建数据库时会自动创建管理帐户 SYS。此帐户可以执行所有数据库管理功能。SYS 模式存储数据字典的基表和视图。这些基表和视图对于 Oracle 数据库的操作至关重要. SYS 模式中的表只能由数据库操作,任何用户都不能修改。”

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

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

当然,这不是这里发生的事情。您已经在 SYS 中构建了自己的表。好吧,放下它们。现在。使用 SYS 创建您自己的用户、GHAZAL 或任何适合的名称,并授予它所需的权限:CREATE SESSION、CREATE TABLE、CREATE TRIGGER 等等。然后以该新用户的身份连接以创建您的表和其他模式对象。

于 2013-03-13T05:02:11.347 回答