Oracle & делает ссылку на ALL_USERS(USERNAME)
Поэтому мне нужно сделать сопоставление из таблицы Employee (idEmployee, name и т. Д.) Реальному пользователю с созданной учетной записью. Я решил добавить таблицу Mapping_Employee_User(idEmployee, userName), как показано ниже
CREATE TABLE Mapping_Employee_User(
idEmployee NUMBER(6)
CONSTRAINT FK_Mapping_Employee_User1 REFERENCES Employee (idEmployee),
userName VARCHAR2(30 BYTE)
CONSTRAINT FK_Mapping_Employee_User2 REFERENCES ALL_USERS(USERNAME),
CONSTRAINT PK_Mapping_Employee_User PRIMARY KEY (idEmployee, userName)
);
Но я получаю "ORA01031 недостаточно прав. Причина: была сделана попытка изменить текущее имя пользователя или пароль..." Но на самом деле я этого не делаю, я просто хочу сделать ссылку.
Как примечание: у меня есть полные права с этим пользователем
Зарегистрированные как SYS, я вижу, что фактическая таблица называется "USER$", и я не могу найти таблицу ALL_USERS... в любом случае, как мне сделать этот вид ссылки??
2 ответа
ALL_USERS
а также USER$
обе системные таблицы / представления. Они поддерживаются на низком уровне самой Oracle. На слишком низком уровне, чтобы обеспечить соблюдение этих ограничений. Вы просто не можете делать то, что пытаетесь сделать.
(Подумайте об этом так: что случилось бы, если бы вы попытались DROP USER bob
? Ожидаете ли вы, что Oracle введет ограничение вашего внешнего ключа? Что произойдет, если ваше пользовательское табличное пространство отключено?)
редактировать: я предлагаю вам просто оставить внешний ключ на имя пользователя. Вы можете запланировать какую-то работу, чтобы сравнить пользователей в Mapping_Employee_User
против DBA_USERS
чтобы убедиться, что они остаются в синхронизации. В качестве альтернативы вы можете управлять своими пользователями Oracle, например, с помощью LDAP (что, как я слышал, возможно).
ALL_USERS - это представление, а не таблица сама по себе.
grant select on all_users to USERNAME;
должно хватить. если вы все еще получаете ORA-01031, это возможно потому, что у пользователя нет привилегии CREATE TABLE:
grant create table to USERNAME;