2010-03-04 122 views
8

我主要是一個oracle新手,所以請原諒我,如果這是一個愚蠢的問題...執行Oracle存儲過程作爲另一個用戶

我有一個名爲「CODE」採用存儲過程執行任意模式SQL(現在,請忽略與此相關的潛在安全問題)。傳入的SQL將選擇數據;但所有數據都駐留在模式A,B或C中 - 但SQL一次只能從一個模式中選擇。

例如:類型A的用戶創建一個字符串'SELECT * FROM A.USERTABLE' - 而類型B的用戶創建一個字符串'SELECT * FROM B.USERTABLE'。

我想要做的是允許用戶不明確指定他們的模式。在前端.net應用程序中;我已經知道他們是A型,B型還是C型。我希望所有三個人都簡單地輸入'SELECT * FROM USERTABLE'。

我遇到的問題是我不知道該怎麼做。我的應用只能在'CODE'模式下執行proc - 所以我不能只複製代碼並讓用戶A調用'A.ExecuteSQL'。

我試過幾件事;但到目前爲止沒有任何工作。我希望ExecuteSQL過程保持在CODE模式中;但是當'USERTABLE'通過時,我需要知道有時這意味着A.USERNAME,有時候B.USERNAME。

有什麼建議嗎?

回答

10

用途:

ALTER SESSION SET CURRENT_SCHEMA = schema 

這是equivalent to SQL Server's EXECUTE AS syntax

+0

這是如何工作的?第一個應用程序執行這個'ALTER'語句或者在'CODE'過程中執行這個語句? – Guru 2010-03-04 03:41:33

+1

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:588045400346317188有更多信息。它看起來像你可以用你的存儲過程中的動態sql(立即執行)來完成它。 – 2010-03-04 04:24:22

+0

@Guru:請參閱Rob P的AskTom鏈接 – 2010-03-04 04:49:01

7

另一種選擇是使用AUTHID CURRENT_USER編譯指示。

如果您在包,程序,函數或類型名稱後立即添加這兩個關鍵字,它將以執行用戶的權限執行,而不是執行CODE模式。這將覆蓋默認行爲是AUTHID DEFINER(即編譯的代碼的模式/用戶的特權)

CREATE FUNCTION examplefunc 
    (pSqlStatement IN VARCHAR2) 
RETURN INTEGER 
    AUTHID CURRENT_USER 
AS 
    lResult INTEGER; 
BEGIN 
    EXECUTE IMMEDIATE pSqlStatement INTO lResult; 
    RETURN lResult; 
END examplefunc; 

注意,對於函數和過程內幕包時,編譯指示只能應用於在包級別。您不能在每個功能的基礎上設置權限。

這應該會導致函數,包等內部的任何SQL以用戶權限執行。

我用它來管理類似的'動態運行任何舊的SQL位' - 至少你會阻止'普通'用戶無法使用存儲過程刪除表或在CODE模式中安裝其他代碼。如果你還沒有 - 添加一些驗證來拋出某些關鍵字 - 也就是說,必須以SELECT開頭,不能包含嵌入的pl/sql塊 - 不管你可以在不破壞的情況下,現有的代碼)。

相關問題