2017-01-26 3 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 р 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; 
/

Я бы предпочел решение, позволяющее объявить переменную тип, чтобы напрямую ссылаться на тип столбца, а не проходить через уровень косвенности (но это не представляется возможным).

Смежные вопросы