我正在嘗試編寫一個表觸發器,用於查詢位於觸發器將駐留的模式之外的另一個表。這可能嗎?看起來我沒有問題在我的模式查詢表,但我得到: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。
你能澄清,你可以在一個正常的SQL會話選擇從這個表/視圖數據,觸發之外? – ninesided 2010-04-16 23:03:01
@nided:是的。請參閱我的編輯瞭解更多詳情。 @everyone:請讓我知道這是否應該重新提交作爲一個新的問題,因爲我不確定標題是否完全準確了。謝謝! – waltwood 2010-04-18 17:37:24
您用於創建觸發器「MAIN_SCHEMA」或其他某個帳戶的用戶帳戶?如果它是一個不同的帳戶,如果以「MAIN_SCHEMA」身份登錄,是否可以運行這些查詢? – 2010-04-19 03:08:10