【问题标题】:What GRANT privileges are required to use %TYPE in variable declaration在变量声明中使用 %TYPE 需要什么 GRANT 权限
【发布时间】:2017-01-26 14:15:33
【问题描述】:

作为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 作为参数定义。

标签: oracle plsql sql-grant


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2013-07-30
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多