在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数据库11g EE 11.2.0.4.0
那么,SYS是特殊的,它拥有的数据库,并可以做任何事情。
如果你想要做同样的其他用户(例如,SCOTT,让它试图创建EXAMPLE_USER的表约束),你除非特权用户授予SCOTT ALTER ANY TABLE
系统权限失败。这样做时,该用户将能够改变任何表(属于任何用户),并且包括创建约束。
如果你想创建一个主键约束,这种特权是不够的 - 你需要CREATE ANY INDEX
特权以及(如主键创建索引以及)。
就像CREATE ANY TABLE
系统权限,它允许您创建任何其他用户的方案表,但该表,然后将属于架构所有者,同样也适用于约束 - 是的,你在代表其他用户创建它,但约束仍然由表所有者,而不是创造者拥有。
因此,词典不说谎,它是你谁误会是怎么回事。