2012-10-04 20 views
1

我以SYSTEM用戶身份登錄Oracle XE實例。當我嘗試運行創建用戶,表和約束的腳本時,我得到一個ORA-01031錯誤。該腳本如下:在不同所有者之間添加外鍵約束

CREATE USER AA IDENTIFIED BY AA DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp; 
CREATE USER BB IDENTIFIED BY BB DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp; 
GRANT ALL PRIVILEGES TO AA WITH ADMIN OPTION; 
GRANT ALL PRIVILEGES TO BB WITH ADMIN OPTION; 
... 
CREATE TABLE ... 
CREATE INDEX ... 
... 
ALTER TABLE "BB"."B_TABLE" ADD CONSTRAINT "FK_BB_AA" FOREIGN KEY ("AA_ID") 
    REFERENCES "AA"."A_TABLE" ("ID") ENABLE; -- this line report the error 

這是不可能的添加在Oracle XE這個約束?

回答

1

首先,永遠不會出現您向用戶授予ALL PRIVILEGES的情況,特別是不授予WITH ADMIN OPTION。這只是管理安全性的一種不好的方式。在任何接近實際系統的情況下,您都需要確定實際需要哪些權限並僅授予這些權限。

其次,爲了在架構BB的外鍵引用AA父表,BB必須具有父表中的REFERENCE特權AA。由於沒有REFERENCE ANY TABLE系統特權,因此在創建表之後但在創建外鍵之前,您需要在AA.A_TABLE上授予BBREFERENCE特權。

GRANT REFERENCES ON aa.a_table TO bb; 
+0

這是不是真實的數據庫,我使用的是Oracle XE做我的應用程序的集成測試,我沒有真正的數據庫服務器上的DBA權限。我沒有這兩個用戶,我有11個用戶和大約70個表。我將不得不對所有表和用戶運行此命令,否則有一種更簡單的方法? – leomcabral

+0

您需要爲每個想要爲該對象創建子表的用戶運行每個對象的語句。看起來非常奇怪的是,有11個用戶基於70個不同的父表創建子表 - 如果這些跨模式外鍵的數量不止一個,那麼識別什麼模式的方法很可能你需要的是有問題的。也就是說,你可以編寫一些動態SQL來生成和執行這個狀態的所有770個組合。 –

+0

我剛剛那樣做了。創建動態SQL以生成組合。謝謝你的提示。 – leomcabral