为什么Oracle数据字典骗我?

时间:2019-02-02 18:26:47

标签: oracle dictionary constraints

在all_constraints表的文档中,它说“所有者”列为我们提供了有关“约束定义的所有者”的信息。但是,在考察活生生的例子,当我发现是假的。

select user from dual; --gives EXAMPLE_USER create table example_user.example_table(id number);

现在,我将用户更改为SYS。

select user from dual --gives SYS alter table example_user.example_table add constraint ex_constrain check(id > 10);

现在最好的部分:

select owner from all_constraints where constraint_name = 'EX_CONSTRAINT'; --gives EXAMPLE_USER and not SYS.

我的问题很简单:为什么? 测试于:Oracle Database 11g EE 11.2.0.4.0

1 个答案:

答案 0 :(得分:1)

嗯,SYS是特殊的,它拥有数据库并且可以执行任何操作。

如果你想做的事与其他用户相同的(例如,SCOTT,让它试图创建EXAMPLE_USER的表约束),你除非特权用户授予SCOTT ALTER ANY TABLE系统特权失败。这样做时,该用户将能够改变任何表(属于任何用户),并且包括创建约束。

如果您想创建主键约束,那么该权限将不够用-您还需要CREATE ANY INDEX权限(因为主键也会创建索引)。

就像CREATE ANY TABLE的系统特权一样,它允许您在任何其他用户的模式中创建表,但是该表将属于模式所有者,约束也一样-是的,您创建了它< EM>在代表另一个用户的,但约束仍然由表的所有者,不创建者所拥有。

因此,词典并没有说谎,是您误解了词典的运行方式。