2017-01-26 55 views
2

由於User1我有表:什麼GRANT權限才能使用%TYPE的變量聲明

CREATE TABLE USER1.test (id NUMBER); 

由於User2我的程序:

CREATE PROCEDURE USER2.passInATestId(
    in_id USER1.TEST.ID%TYPE 
) 
IS 
BEGIN 
    NULL; 
END; 
/

然而,這種失敗,編譯:

PLS-00201: identifier 'USER1.TEST' must be declared 

如果我授予REFERENCES p ermissions

GRANT REFERENCES ON USER1.TEST TO USER2; 

然後我得到:

PLS-00904: insufficient privilege to access object USER1.TEST 

如果我授予SELECT特權那麼它將編譯 - 然而,User2就可以對錶執行選擇,我不希望他們能夠直接做到這一點。有沒有我可以使用的特權,允許我參考列的類型,但是不允許從表格中獲得SELECT的能力?

+0

我不認爲這是可能的。您將不得不使用'in_id number'作爲參數定義。 –

回答

2

一種可能的解決方案是創建在由USER1擁有的封裝的SUBTYPE

CREATE PACKAGE USER1.TYPE_DEFINITIONS 
AS 
    SUBTYPE TYPE__TEST__ID IS USER1.TEST.ID%TYPE; 
END; 
/

然後:

GRANT EXECUTE ON USER1.TYPE_DEFINITIONS TO USER2; 

該過程然後可以被重寫爲:

CREATE PROCEDURE USER2.passInATestId(
    in_id USER1.TYPE_DEFINITIONS.TYPE__TEST__ID 
) 
IS 
BEGIN 
    NULL; 
END; 
/

我更喜歡一個允許聲明變量的解決方案鍵入直接引用列的類型而不是經過間接級別(但似乎不可能)。

相關問題