根据Oracle,OWNER
中的(ALL|USER|DBA)_CONSTRAINTS
字段是约束的所有者。为了关联到该约束所属的表,此视图提供了TABLE_NAME
,但是要唯一地标识表,我需要表的所有者和表名。因为*_CONSTRAINTS
和*_ALL_CONS_COLUMNS
视图没有TABLE_OWNER
字段,这是否意味着约束所有者与表所有者相同?或者换句话说,约束只能由表的所有者添加吗?
这是否意味着约束所有者与表所有者相同?
是
只能由表的所有者添加约束吗?
否,它可以由具有alter any table
特权的另一个用户添加。其中之一是SYS
。这是一个例子:
以Scott的身份联系,我正在创建一个表:
SQL> connect scott/tiger
Connected.
SQL> create table test (id number);
Table created.
作为SYS连接并更改Scott的表-添加主键约束:
SQL>将sys作为sysdba连接
Enter password:
Connected.
SQL> alter table scott.test add constraint pk_test primary key (id);
Table altered.
返回斯科特,检查谁拥有什么:
SQL> select constraint_name, owner from all_constraints where table_name = 'TEST';
CONSTRAINT_NAME OWNER
------------------------------ ------------------------------
PK_TEST SCOTT
SQL> select table_name, owner From all_tables where table_name = 'TEST';
TABLE_NAME OWNER
------------------------------ ------------------------------
TEST SCOTT
SQL>
如您所见,Scott拥有everything。
表的所有者在另一列R_OWNER
中找到。实际上,一个用户可以在另一个用户的表上创建约束(并拥有其定义)。