2011-12-02 33 views
2

所以我需要做一個映射從僱員表(idEmployee,名稱等..)到一個真實的用戶與一個帳戶創建。我決定增加一個表Mapping_Employee_User(idEmployee,用戶名)像下面甲骨文&參考ALL_USERS(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 ......反正我該怎麼辦這種參考?

回答

5

ALL_USERSUSER$都是系統表/視圖。 Oracle自己維護在一個較低的級別。水平太低,無法強制執行這些限制。你根本無法做你想做的事。

(想想這樣說:如果你試圖DROP USER bob發生什麼了你希望甲骨文執行你的外鍵約束髮生什麼了,如果你的用戶表空間離線???)

編輯:我建議你放棄userName上的外鍵。您可能需要安排一些工作來比較Mapping_Employee_UserDBA_USERS中的用戶,以確保它們保持同步。或者,您可能想要使用LDAP(我聽說可能)來管理您的Oracle用戶。

+0

我已經改變了一條線,現在得到一個小錯誤:約束約束FK_Mapping_Employee_User2參考文獻SYS.USER $(NAME)。現在它只是說表不存在,但這個選擇工作得很好:SELECT NAME FROM SYS.USER $ ...那麼是什麼?我如何跳過這一個? –

+0

@IftimieVlad:文檔說你根本不應該觸摸SYS.USER $。我懷疑有沒有解決這個錯誤的方法。至少不是一種足夠理智的方式來思考(我的意思是,只要你用數據字典混淆,也許你可以找到如何存儲約束並直接插入它,但不這樣做)。 – derobert

+0

是的,你是對的...我決定使用沒有引用部分的表格。 –

0

ALL_USERS是一個視圖,而不是一個表本身。

grant select on all_users to USERNAME;

應該足夠了。如果你仍然得到ORA-01031可能是因爲用戶不具有CREATE TABLE特權:

grant create table to USERNAME;

+0

我已經擁有第一個用戶的所有角色(當我創建他時授予他所有的角色)。請看下面..我添加了一些東西 –

+0

只是爲了安全起見 - 創建一個表,看看它是否工作 –