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;

Другие вопросы по тегам