在变量声明中使用 %TYPE 需要哪些 GRANT 权限

What GRANT privileges are required to use %TYPE in variable declaration

作为 User1 我有 table:

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 权限

GRANT REFERENCES ON USER1.TEST TO USER2;

然后我得到:

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

如果我授予 SELECT 权限,那么它将编译 - 但是,User2 可以在 table 上执行选择,我不希望他们直接这样做。是否有我可以使用的特权,允许我引用列的类型,而无需同时授予 table?

SELECT 能力

一个可能的解决方案是在 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;
/

我更喜欢允许变量类型声明直接引用列类型的解决方案,而不是通过间接级别(但这似乎不可能)。