0

特定のユーザーの 2 つの異なるテーブルからロールと権限を取得しようとしています。私のクエリはこれです:

Select r.grantee, r.granted_role , s.privilege 
From dba_role_privs r, dba_sys_privs s 
Where r.grantee=s.grantee and r.grantee=(select username from dba_users where username='HR'); 

私はこれで終わっています:

GRANTEE    GRANTED_ROLE         PRIVILEGE
---------- -------------------- --------------------
HR         DBA                  CREATE VIEW
HR         RESOURCE             CREATE VIEW
HR         DBA                  UNLIMITED TABLESPACE
HR         RESOURCE             UNLIMITED TABLESPACE
HR         DBA                  CREATE DATABASE LINK
HR         RESOURCE             CREATE DATABASE LINK
HR         DBA                  CREATE SEQUENCE
HR         RESOURCE             CREATE SEQUENCE
HR         DBA                  CREATE SESSION
HR         RESOURCE             CREATE SESSION
HR         DBA                  ALTER SESSION

GRANTEE    GRANTED_ROLE         PRIVILEGE
---------- -------------------- --------------------
HR         RESOURCE             ALTER SESSION
HR         DBA                  CREATE SYNONYM
HR         RESOURCE             CREATE SYNONYM

14 rows selected.

ユーザーが多くのロール/権限を持っていない場合は問題ありませんが、たとえばSYSのようなユーザーの場合、私は最終的に10600 rows selected.

クエリの結果を改善する方法はありますか? 私は参加を逃しましたか?

PS: 私は oracle 11g に取り組んでいます。

あなたがそれをより良くするのを助けることができるなら、そうしてください

ありがとうございます!

4

1 に答える 1

0

おそらくunion all、結合ではなく、次のようにします。

Select r.grantee, r.granted_role as role_or_privilege
From dba_role_privs r, 
Where r.grantee = (select username from dba_users where username = 'HR'); 
union all
select s.grantee, s.privilege 
from dba_sys_privs s 
Where s.grantee = (select username from dba_users where username = 'HR'); 

whereクエリと同じロジックを残しました。ただし、これは私にとってより理にかなっています。

Select r.grantee, r.granted_role as role_or_privilege
From dba_role_privs r, 
Where r.grantee = 'HR'; 
union all
select s.grantee, s.privilege 
from dba_sys_privs s 
Where s.grantee = 'HR'; 
于 2016-01-29T16:25:59.410 に答える