ALL_CONSTRAINTS 和 ALL_CONS_COLUMNS 中的所有者是否与 table 所有者相同?
Is the OWNER in ALL_CONSTRAINTS and ALL_CONS_COLUMNS the same as the table owner?
根据 Oracle,(ALL|USER|DBA)_CONSTRAINTS
中的 OWNER
字段是约束的所有者。为了与此约束所属的 table 相关,此视图提供 TABLE_NAME
,但是为了唯一标识 table,我需要 table 的所有者和table 姓名。因为 *_CONSTRAINTS
和 *_ALL_CONS_COLUMNS
视图没有 TABLE_OWNER
字段,这是否意味着约束所有者与 table 所有者相同?或者换句话说,约束只能由 table 的所有者添加吗?
does this mean that the constraint owner is the same as the table owner?
是的。
can a constraint only be added by the owner of the table?
不,它可以由另一个拥有 alter any table
权限的用户添加。其中之一是 SYS
。这是一个例子:
以 Scott 的身份连接,我正在创建 table:
SQL> connect scott/tiger
Connected.
SQL> create table test (id number);
Table created.
以 SYS 身份连接并更改 Scott 的 table - 添加主键约束:
SQL> connect sys as 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>
如您所见,斯科特拥有一切。
根据 Oracle,(ALL|USER|DBA)_CONSTRAINTS
中的 OWNER
字段是约束的所有者。为了与此约束所属的 table 相关,此视图提供 TABLE_NAME
,但是为了唯一标识 table,我需要 table 的所有者和table 姓名。因为 *_CONSTRAINTS
和 *_ALL_CONS_COLUMNS
视图没有 TABLE_OWNER
字段,这是否意味着约束所有者与 table 所有者相同?或者换句话说,约束只能由 table 的所有者添加吗?
does this mean that the constraint owner is the same as the table owner?
是的。
can a constraint only be added by the owner of the table?
不,它可以由另一个拥有 alter any table
权限的用户添加。其中之一是 SYS
。这是一个例子:
以 Scott 的身份连接,我正在创建 table:
SQL> connect scott/tiger
Connected.
SQL> create table test (id number);
Table created.
以 SYS 身份连接并更改 Scott 的 table - 添加主键约束:
SQL> connect sys as 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>
如您所见,斯科特拥有一切。