SESSION_PRIVS和SESSION_ROLES动态视图

转自 http://blog.itpub.net/4227/viewspace-674527/

SESSION_PRIVS和SESSION_ROLES用来获取用户当前的授权和角色,和V$视图类似,这两个视图访问的是当前生效的权限和角色。

对比调用者权限存储过程和定义者权限存储过程:

SQL> 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命令有不少相似之处,都是反映查询时刻的真实情况。

posted @ 2014-03-30 01:57  princessd8251  阅读(473)  评论(0)    收藏  举报