2010-04-16 71 views
3

我正在嘗試編寫一個表觸發器,用於查詢位於觸發器將駐留的模式之外的另一個表。這可能嗎?看起來我沒有問題在我的模式查詢表,但我得到:Oracle數據庫中的表觸發器的多模式權限

Error: ORA-00942: table or view does not exist 

當試圖嘗試查詢我的架構之外的表。

編輯

我不提供儘可能多的信息可以在第一時間道歉左右。我覺得這個問題更簡單。

我想在一個表上創建一個觸發器,該表根據可能存在或可能不存在於另一個模式中的表中的某些數據的存在來更改新插入的行上的某些字段。

我用來創建觸發器的用戶帳戶具有獨立運行查詢的權限。事實上,我有我的觸發器打印我試圖運行的查詢,並能成功地運行它自己。

我還應該注意到,我通過使用EXECUTE IMMEDIATE語句動態構建查詢。下面是一個示例:

CREATE OR REPLACE TRIGGER MAIN_SCHEMA.EVENTS 
BEFORE INSERT 
ON MAIN_SCHEMA.EVENTS REFERENCING OLD AS OLD NEW AS NEW 
FOR EACH ROW 
DECLARE 
    rtn_count NUMBER := 0; 
    table_name VARCHAR2(17) := :NEW.SOME_FIELD; 
    key_field VARCHAR2(20) := :NEW.ANOTHER_FIELD; 
BEGIN 
    CASE 
     WHEN (key_field = 'condition_a') THEN 
      EXECUTE IMMEDIATE 'select count(*) from OTHER_SCHEMA_A.'||table_name||' where KEY_FIELD='''||key_field||'''' INTO rtn_count; 
     WHEN (key_field = 'condition_b') THEN 
      EXECUTE IMMEDIATE 'select count(*) from OTHER_SCHEMA_B.'||table_name||' where KEY_FIELD='''||key_field||'''' INTO rtn_count; 
     WHEN (key_field = 'condition_c') THEN 
      EXECUTE IMMEDIATE 'select count(*) from OTHER_SCHEMA_C.'||table_name||' where KEY_FIELD='''||key_field||'''' INTO rtn_count; 
    END CASE; 

    IF (rtn_count > 0) THEN 
     -- change some fields that are to be inserted 
    END IF; 
END; 

由於前面提到的錯誤,觸發器接口在EXECUTE IMMEDIATE上失敗。

編輯

我已經做了一些調查研究,我可以提供更多的澄清。

我用來創建此觸發器的用戶帳戶不是MAIN_SCHEMA或OTHER_SCHEMA_X中的任何一個。我正在使用的帳戶(ME)通過模式用戶自己爲相關表賦予權限。例如(USER_TAB_PRIVS):

GRANTOR  GRANTEE TABLE_SCHEMA TABLE_NAME PRIVILEGE GRANTABLE HIERARCHY 
MAIN_SCHEMA ME  MAIN_SCHEMA EVENTS  DELETE NO  NO 
MAIN_SCHEMA ME  MAIN_SCHEMA EVENTS  INSERT NO  NO 
MAIN_SCHEMA ME  MAIN_SCHEMA EVENTS  SELECT NO  NO 
MAIN_SCHEMA ME  MAIN_SCHEMA EVENTS  UPDATE NO  NO 
OTHER_SCHEMA_X ME  OTHER_SCHEMA_X TARGET_TBL SELECT NO   NO 

而且我有以下的系統權限(USER_SYS_PRIVS):

USERNAME PRIVILEGE   ADMIN_OPTION 
ME   ALTER ANY TRIGGER NO 
ME   CREATE ANY TRIGGER NO 
ME   UNLIMITED TABLESPACE NO 

這是我在Oracle文檔中找到:

創建另一個用戶的 模式中的觸發器,或者引用 模式中觸發器的另一模式中的表,您必須具有CREATE ANY TRIGGER系統特權。有了這個特權,可以在任何模式中創建觸發器 ,並且可以將 與任何用戶的表相關聯。另外, 創建觸發器的用戶必須 也具有 引用的程序,函數或 包的EXECUTE特權。

這裏:Oracle Doc

因此,它看起來對我來說,這應該工作,但我不知道的「EXECUTE權限」它指的是在doc。

+0

你能澄清,你可以在一個正常的SQL會話選擇從這個表/視圖數據,觸發之外? – ninesided 2010-04-16 23:03:01

+0

@nided:是的。請參閱我的編輯瞭解更多詳情。 @everyone:請讓我知道這是否應該重新提交作爲一個新的問題,因爲我不確定標題是否完全準確了。謝謝! – waltwood 2010-04-18 17:37:24

+0

您用於創建觸發器「MAIN_SCHEMA」或其他某個帳戶的用戶帳戶?如果它是一個不同的帳戶,如果以「MAIN_SCHEMA」身份登錄,是否可以運行這些查詢? – 2010-04-19 03:08:10

回答

0

你應該爲每個表和模式涉及執行此:

grant select on OTHER_SCHEMA_%.table_name to MAIN_SCHEMA; 
+1

APC是在正確的軌道上,你打它回家,可能是因爲我終於得到所有有關的信息在一起。不幸的是,我無法驗證,因爲我沒有必要的訪問級別,並且我已經告訴DBA我會在我的應用程序邏輯中處理這個問題。你會認爲他們會從一開始就知道這一點......無論如何,謝謝大家! – waltwood 2010-04-20 14:59:52

5

您所遇到的是Oracle安全模型的一個特性。使用模式的全部重點是控制對數據的訪問。我的架構中的表格是,我的,在我授予您特權之前,您甚至不能看到它們。

的語法很簡單:車主模式發出

grant select, insert on my_table to you 
/

另外一個帳戶與授予任何權限(如DBA)可以通過任何用戶的對象權限。

grant select, insert on apc.my_table to you 
/

被授予者可以是用戶也可以是角色。但是請注意,我們只能建立程序單元 - 存儲過程,視圖,觸發器 - 使用已直接授予我們用戶的權限。

因此,如果您讓其他架構所有者授予您必要的權限,您將能夠構建觸發器。

編輯

當引用另一個模式中,我們需要有資格與架構名稱對象的對象....

insert into apc.whatever_table values ... 

否則,我們需要爲它創建

的代名詞
create synonym whatever for apc.whatever_table; 
+0

這是我的想法,等待澄清 – ninesided 2010-04-16 23:12:05

2

我覺得有人應該添加顯而易見的 - 其他模式的表必須使用模式名稱或私有/公共syn onym是必要的。我想知道最初的問題是否僅僅是一個名稱解析問題。如果沒有,APC的答案是對Oracle安全模型的一個很好的解釋。

+0

我同意這裏:select * from anothershema.table – Randy 2010-04-17 14:22:32

相關問題