這裏是存儲過程的定義:執行即時在存儲過程中不斷給特權時不足錯誤
CREATE OR REPLACE PROCEDURE usp_dropTable(schema VARCHAR, tblToDrop VARCHAR) IS
BEGIN
DECLARE v_cnt NUMBER;
BEGIN
SELECT COUNT(*)
INTO v_cnt
FROM all_tables
WHERE owner = schema
AND table_name = tblToDrop;
IF v_cnt > 0 THEN
EXECUTE IMMEDIATE('DROP TABLE someschema.some_table PURGE');
END IF;
END;
END;
這裏是呼叫:
出於某種原因,我不斷收到不足EXECUTE IMMEDIATE命令的權限錯誤。我查看了聯機狀態,發現權限不足通常意味着oracle用戶帳戶對查詢中使用的傳遞命令(在本例中爲DROP)沒有權限。不過,我有權限下降。我很困惑,我似乎無法找到適合我的解決方案。
感謝您提前。
SOLUTION:
正如史蒂夫下文提到,甲骨文的安全模型是怪異的,因爲它需要知道使用什麼樣的權限,程序明確的地方。讓Oracle知道的方法是在CREATE OR REPLACE語句中使用AUTHID關鍵字。如果您需要與過程創建者相同的權限級別,則使用AUTHID DEFINER。如果您希望Oracle使用當前正在運行存儲過程的用戶的特權,則希望使用AUTHID CURRENT_USER。過程聲明如下所示:
CREATE OR REPLACE PROCEDURE usp_dropTable(schema VARCHAR, tblToDrop VARCHAR)
AUTHID CURRENT_USER IS
BEGIN
DECLARE v_cnt NUMBER;
BEGIN
SELECT COUNT(*)
INTO v_cnt
FROM all_tables
WHERE owner = schema
AND table_name = tblToDrop;
IF v_cnt > 0 THEN
EXECUTE IMMEDIATE('DROP TABLE someschema.some_table PURGE');
END IF;
END;
END;
謝謝大家的回覆。這是解決問題的絕對煩人的問題。
我正面臨着類似的問題,但有趣的是,不使用「AUTHID DEFINER」或「AUTHID CURRENT_USER」的過程,對於DROP TABLE執行聲明,但不適用於創建表。 AUTHID解決方案有效:)謝謝! – Aniket 2012-08-21 18:16:38
謝謝,這兩個字「AUTHID CURRENT_USER」解決了我的問題!謝謝! – Roman 2014-02-17 18:07:56