使用%TYPE进行变量声明需要哪些GRANT权限?

6
作为用户User1,我拥有以下表格:
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可以在表上执行选择操作,而我不希望他们直接这样做。是否有一种权限可以让我引用列的类型,而无需同时授予从表中进行SELECT的能力?

我认为这是不可能的。你必须使用 in_id number 作为参数定义。 - user330315
1个回答

4

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

我希望有一种解决方案,允许变量的类型声明直接引用列的类型,而不是通过一个间接层(但这似乎不可能)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接