Подключившись как scott
, я создам таблицу и ограничение внешнего ключа, которое ссылается на другую таблицу в той же схеме.
SQL> show user
USER is "SCOTT"
SQL>
SQL> create table test_d as select * From dept;
Table created.
SQL> alter table test_d add constraint pk_td primary key (deptno);
Table altered.
SQL> create table test (deptno number constraint fk_d references test_d (deptno));
Table created.
Подключение как другого пользователя (mike
) и попробуйте удалить ограничение внешнего ключа, принадлежащее scott
:
SQL> connect mike/lion
Connected.
SQL> -- without any grants - of course it doesn't work
SQL> alter table scott.test drop constraint fk_d;
alter table scott.test drop constraint fk_d
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> -- Barbaros suggested to GRANT REFERENCES ON test TO mike, but that won't work either.
SQL> -- REFERENCES is used to let someone else ... well, "reference" your table:
SQL> alter table scott.test drop constraint fk_d;
alter table scott.test drop constraint fk_d
*
ERROR at line 1:
ORA-01031: insufficient privileges
ОК, мы увидели, что не работает. Давайте теперь посмотрим, что работает :
SQL> -- SCOTT granted ALTER: grant alter on test to mike;
SQL> -- Let's check it:
SQL> select table_name, privilege from user_tab_privs where grantor = 'SCOTT';
TABLE_NAME PRIVILEGE
------------------------------ ----------------------------------------
TEST ALTER
SQL> -- OK, now - drop the constraint
SQL> alter table scott.test drop constraint fk_d;
Table altered.
SQL>
Наконец, чтобы ответить на вопрос: владелец таблицы должен предоставить alter
для этой таблицы. SYS
(DBA
) вообще не должен участвовать.