SESSION_PRIVS和SESSION_ROLES用来获取用户当前的授权和角色,和V$视图类似,这两个视图访问的是当前生效的权限和角色。
对比调用者权限存储过程和定义者权限存储过程:
QL> SELECT * FROM SESSION_PRIVS;
PRIVILEGE
----------------------------------------
ALTER SYSTEM
CREATE SESSION
ALTER SESSION
UNLIMITED TABLESPACE
CREATE TABLE
CREATE VIEW
CREATE DATABASE LINK
CREATE PROCEDURE
CREATE TRIGGER
CREATE MATERIALIZED VIEW
CREATE TYPE
已选择11行。
SQL> SELECT * FROM SESSION_ROLES;
ROLE
------------------------------
R_TEST
PLUSTRACE
SQL> SET SERVEROUT ON
SQL> CREATE OR REPLACE PROCEDURE P_DEFINER
2 AS
3 BEGIN
4 DBMS_OUTPUT.PUT_LINE('PRIVILEGE:');
5 FOR I IN (SELECT PRIVILEGE FROM SESSION_PRIVS) LOOP
6 DBMS_OUTPUT.PUT_LINE(' ' || I.PRIVILEGE);
7 END LOOP;
8 DBMS_OUTPUT.NEW_LINE;
9 DBMS_OUTPUT.PUT_LINE('ROLE:');
10 FOR I IN (SELECT ROLE FROM SESSION_ROLES) LOOP
11 DBMS_OUTPUT.PUT_LINE(' ' || I.ROLE);
12 END LOOP;
13 END;
14 /
过程已创建。
SQL> CREATE OR REPLACE PROCEDURE P_INVOKER
2 AUTHID CURRENT_USER
3 AS
4 BEGIN
5 DBMS_OUTPUT.PUT_LINE('PRIVILEGE:');
6 FOR I IN (SELECT PRIVILEGE FROM SESSION_PRIVS) LOOP
7 DBMS_OUTPUT.PUT_LINE(' ' || I.PRIVILEGE);
8 END LOOP;
9 DBMS_OUTPUT.NEW_LINE;
10 DBMS_OUTPUT.PUT_LINE('ROLE:');
11 FOR I IN (SELECT ROLE FROM SESSION_ROLES) LOOP
12 DBMS_OUTPUT.PUT_LINE(' ' || I.ROLE);
13 END LOOP;
14 END;
15 /
过程已创建。
SQL> EXEC P_DEFINER
PRIVILEGE:
ALTER SYSTEM
CREATE SESSION
ALTER SESSION
UNLIMITED TABLESPACE
CREATE TABLE
CREATE VIEW
CREATE DATABASE LINK
CREATE PROCEDURE
CREATE TRIGGER
CREATE MATERIALIZED VIEW
CREATE TYPE
ROLE:
PL/SQL 过程已成功完成。
SQL> EXEC P_INVOKER
PRIVILEGE:
ALTER SYSTEM
CREATE SESSION
ALTER SESSION
UNLIMITED TABLESPACE
CREATE TABLE
CREATE VIEW
CREATE DATABASE LINK
CREATE PROCEDURE
CREATE TRIGGER
CREATE MATERIALIZED VIEW
CREATE TYPE
ROLE:
R_TEST
PLUSTRACE
PL/SQL 过程已成功完成。
对于定义者权限存储过程,角色是无效的,因此在存储过程中访问SESSION_ROLES视图查询不到任何记录,而调用者权限存储过程中是可以查看到。
这种特性和sqlplus的SHOW PARAMETER命令有不少相似之处,都是反映查询时刻的真实情况。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-674527/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/4227/viewspace-674527/