在变量声明中使用%TYPE需要什么GRANT权限

时间:2017-01-26 14:15:34

标签: oracle plsql grant

作为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的能力?

1 个答案:

答案 0 :(得分:2)

一种可能的解决方案是在SUBTYPE拥有的包中创建USER1

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;
/

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