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