在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
答案 0 :(得分:1)
嗯,SYS是特殊的,它拥有数据库并且可以执行任何操作。
如果你想做的事与其他用户相同的(例如,SCOTT,让它试图创建EXAMPLE_USER的表约束),你除非特权用户授予SCOTT ALTER ANY TABLE
系统特权失败。这样做时,该用户将能够改变任何表(属于任何用户),并且包括创建约束。
如果您想创建主键约束,那么该权限将不够用-您还需要CREATE ANY INDEX
权限(因为主键也会创建索引)。
就像CREATE ANY TABLE
的系统特权一样,它允许您在任何其他用户的模式中创建表,但是该表将属于模式所有者,约束也一样-是的,您创建了它< EM>在代表另一个用户的,但约束仍然由表的所有者,不创建者所拥有。
因此,词典并没有说谎,是您误解了词典的运行方式。