我执行以下 SQL 来确认我没有 DBMS_SESSION 包的权限:
SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE = 'MY_USER' AND TABLE_NAME = 'DBMS_SESSION' AND GRANTOR = 'SYS';
没有返回任何行,那么为什么我能够成功调用它?
SELECT DBMS_SESSION.UNIQUE_SESSION_ID FROM DUAL;
UNIQUE_SESSION_ID |
---|
0029D4020001 |
此外,我可以用 DBMS_SESSION.SET_CONTEXT 编译一个包,并且使用它没有问题。
CREATE OR REPLACE PACKAGE CANCELLATION_TOKEN AS
NAMESPACE CONSTANT VARCHAR2(30 BYTE) := 'CANCELLATION_TOKEN';
FUNCTION isSignalled(in_token_name IN VARCHAR2) RETURN BOOLEAN;
PROCEDURE wait_for(in_token_name IN VARCHAR2);
PROCEDURE clear(in_token_name IN VARCHAR2);
PROCEDURE signal(in_token_name IN VARCHAR2);
END CANCELLATION_TOKEN;
/
CREATE OR REPLACE PACKAGE BODY CANCELLATION_TOKEN AS
FUNCTION isSignalled(in_token_name IN VARCHAR2) RETURN BOOLEAN AS
BEGIN
RETURN SYS_CONTEXT(NAMESPACE, in_token_name) = '1';
END isSignalled;
PROCEDURE wait_for(in_token_name IN VARCHAR2) AS
BEGIN
DBMS_SESSION.set_context(NAMESPACE, in_token_name, '-1');
END wait_for;
PROCEDURE clear(in_token_name IN VARCHAR2) AS
BEGIN
DBMS_SESSION.set_context(NAMESPACE, in_token_name, '0');
END clear;
PROCEDURE signal(in_token_name IN VARCHAR2) AS
BEGIN
DBMS_SESSION.set_context(NAMESPACE, in_token_name, '1');
END signal;
END CANCELLATION_TOKEN;
/
CREATE OR REPLACE CONTEXT CANCELLATION_TOKEN USING CANCELLATION_TOKEN ACCESSED GLOBALLY;
我很困惑,因为即使是数据库安全指南/第三部分控制对数据的访问/14使用应用程序上下文检索用户信息/14.4全局应用程序上下文/14.4.6管理全局应用程序上下文的PL/SQL包/14.4。 6.1 关于管理全局应用程序上下文的包规定如下:
在使用 DBMS_SESSION 程序包的过程之前,您必须具有该程序包的 EXECUTE 权限。通常,您创建此包并将其存储在安全管理员的数据库架构中。SYS 模式拥有 DBMS_SESSION 包。
但它无需 EXECUTE 权限即可工作!你能帮我理解为什么吗?
具体来说,执行权限可能不会授予您,但是您是否检查过它被授予了谁?