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命令有不少相似之处,都是反映查询时刻的真实情况。
小小菜鸟一枚
浙公网安备 33010602011771号