roleinfo.sql

rem
rem Information about roles - Roles, Privileges, assigned users, etc.
rem
rem Biju Thomas
rem
rem Provide the role name along with the scriptname
rem
set serveroutput on feedback off verify off pages 0
spool /tmp/roleinfo.lst
declare
     wrole varchar2 (30) := '&1';
     /*  Users */
     cursor crole is select role
     from dba_roles where
     role like upper(wrole);
     /* Roles granted */
     cursor crg (r in varchar2) is
     select granted_role, admin_option, default_role
     from dba_role_privs where
     grantee = upper(r)
     order by granted_role;
     /* System privileges granted */
     cursor csg (r in varchar2) is
     select privilege, admin_option
     from dba_sys_privs where
     grantee = upper(r)
     order by privilege;
     /* Object privileges granted */
     cursor cog (r in varchar2) is
     select (owner ||'.'|| table_name) object, privilege
     from dba_tab_privs where
     grantee = upper(r)
     order by owner, table_name;
     /* Column privileges granted */
     cursor ccg (r in varchar2) is
     select (owner ||'.'|| table_name ||'.'|| column_name) wcolumn, privilege
     from dba_col_privs where
     grantee = upper(r)
     order by  owner, table_name, column_name;
     /* Users / roles granted this role */
     cursor cug (r in varchar2) is 
     select grantee, admin_option, default_role
     from dba_role_privs where
     granted_role = upper(r)
     order by grantee;
     wcount number := 0;
     wdate varchar2 (25) := to_char(sysdate,'Mon DD, YYYY  HH:MI AM');
     w5space char(5) := '.    ';
     wdum1 varchar2 (255);
     wdum2 varchar2 (255);
     wdum3 varchar2 (255);
     wdum4 varchar2 (255);
     wdum5 varchar2 (255);
     wdum6 varchar2 (255);
     wdum7 varchar2 (255);
  begin
    dbms_output.enable(100000);
    for rrole in crole loop
      dbms_output.put_line('********** ROLE INFORMATION **********                ' || wdate);
      dbms_output.put_line('*--------------------------------------------------------------------------*');
      wcount := wcount + 1;
      dbms_output.put_line('Role Name : ' || rrole.role);
      dbms_output.put_line(w5space);
      open crg (rrole.role);
      fetch crg into wdum1, wdum2, wdum3;
      if crg%notfound then
         dbms_output.put_line('********** ' || rrole.role || ' - NO OTHER ROLES GRANTED  *********');
         close crg;
      else
         close crg;
         dbms_output.put_line('********** ' || rrole.role || ' - OTHER ROLES GRANTED  *********');
         dbms_output.put_line(w5space || 'Role name                                         Admin     Default');
         dbms_output.put_line(w5space || '*---------------------------------------------------------------------*');
         for rrg  in crg (rrole.role) loop
          dbms_output.put_line(w5space || rpad(rrg.granted_role,50) || rpad(rrg.admin_option,10) || rpad(rrg.default_role,10));
         end loop;
         dbms_output.put_line(w5space);
      end if;
      dbms_output.put_line(w5space);
      open csg (rrole.role);
      fetch csg into wdum1, wdum2;
      if csg%notfound then
         dbms_output.put_line('********** ' || rrole.role || ' - NO SYSTEM PRIVILEGES GRANTED  *********');
         close csg;
      else
         close csg;
         dbms_output.put_line('********** ' || rrole.role || ' - SYSTEM PRIVILEGES GRANTED  *********');

         dbms_output.put_line(w5space || 'System Privilege                                  Admin');
         dbms_output.put_line(w5space || '*---------------------------------------------------------------------*');
         for rsg  in csg (rrole.role) loop
          dbms_output.put_line(w5space || rpad(rsg.privilege,50) || rpad(rsg.admin_option,10));
         end loop;
         dbms_output.put_line(w5space);
      end if;
      dbms_output.put_line(w5space);
      open cog (rrole.role);
      fetch cog into wdum1, wdum2;
      if cog%notfound then
         dbms_output.put_line('********** ' || rrole.role || ' - NO OBJECT PRIVILEGES GRANTED  *********');
         close cog;
      else
         close cog;
         dbms_output.put_line('********** ' || rrole.role || ' - OBJECT PRIVILEGES GRANTED  *********');

         dbms_output.put_line(w5space || 'Object Name                             Privilege');
         dbms_output.put_line(w5space || '*---------------------------------------------------------------------*');
         for rog  in cog (rrole.role) loop
          dbms_output.put_line(w5space || rpad(rog.object,40) || rpad(rog.privilege,30));
         end loop;
         dbms_output.put_line(w5space);
      end if;
      dbms_output.put_line(w5space);
      open ccg (rrole.role);
      fetch ccg into wdum1, wdum2;
      if ccg%notfound then
         dbms_output.put_line('********** ' || rrole.role || ' - NO COLUMN PRIVILEGES GRANTED  *********');
         close ccg;
      else
         close ccg;
         dbms_output.put_line('********** ' || rrole.role || ' - COLUMN PRIVILEGES GRANTED  *********');

         dbms_output.put_line(w5space || 'Column Name                                       Privilege');
         dbms_output.put_line(w5space || '*---------------------------------------------------------------------*');
         for rcg  in ccg (rrole.role) loop
          dbms_output.put_line(w5space || rpad(rcg.wcolumn,50) || rpad(rcg.privilege,20));
         end loop;
         dbms_output.put_line(w5space);
      end if;
      dbms_output.put_line(w5space);
      open cug (rrole.role);
      fetch cug into wdum1, wdum2, wdum3;
      if cug%notfound then
         dbms_output.put_line('********** ' || rrole.role || ' - NO USERS/ROLES ASSIGNED  *********');
         close cug;
      else
         close cug;
         dbms_output.put_line('********** ' || rrole.role || ' - USERS/ROLES ASSIGNED  *********');
         dbms_output.put_line(w5space || 'User / Role Name                                  Admin     Default');
         dbms_output.put_line(w5space || '*---------------------------------------------------------------------*');
         for rug  in cug (rrole.role) loop
          dbms_output.put_line(w5space || rpad(rug.grantee,50) || rpad(rug.admin_option,10) || rpad(rug.default_role,10));
         end loop;
         dbms_output.put_line(w5space);
      end if;
      dbms_output.put_line('*--------------------------------------------------------------------------*');
    end loop;
    if wcount =0 then
      dbms_output.put_line('******************************************************');
      dbms_output.put_line('*                                                    *');
      dbms_output.put_line('* Plese Verify Input Parameters... No Matches Found! *');
      dbms_output.put_line('*                                                    *');
      dbms_output.put_line('******************************************************');
    end if;
  end;
/
set serveroutput off feedback on verify on pages 999
spool off
prompt
prompt Output saved at /tmp/roleinfo.lst