2015-04-15 150 views
1

問題:我正在研究一個將生成所有Oracle用戶列表的查詢。我希望在查詢中確定它們是否具有CONNECTAPPUSER的特定授予權限並將它們顯示在一個表中。檢查Oracle用戶的特定權限

我曾嘗試:我使用一個表,DBA_ROLE_PRIVS。此表顯示了我需要的所有信息,但未能正確查詢。我可以告訴誰擁有權限的所有用戶Connect有:

SELECT GRANTEE as "User Name", granted_role as "Connect" 
FROM DBA_ROLE_PRIVS 
WHERE GRANTED_ROLE='CONNECT'; 

我也可以顯示誰有權APPUSER用戶,只需通過更換APPUSERCONNECT

我的問題是在一個查詢中顯示兩個權限。我嘗試過使用不同的JOIN s。但是,使用這似乎需要兩個表或更多。我研究過一個「自我加入」,但不知道如何使用兩個WHERE子句。我已經試過的東西,如:

SELECT grantee as "User Name", t1.granted_role as "Connect", t2.granted_role as "APPUSER" 
FROM t1.DBA_ROLE_PRIVS join t2.DBA_ROLE_PRIVS on t1.GRANTEE = t2.GRANTEE 
WHERE t1.GRANTED_ROLE='CONNECT' and t2.GRANTED_ROLE='APP_USER'; 

我想我最終的查詢顯示是這樣的:

User Name   Connect  App User 
----------  ----------  ---------- 
Bob    CONNECT  APPUSER 
Sue        APPUSER 
Nick    CONNECT  APPUSER 
Rob    CONNECT   

回答

1
SELECT GRANTEE as "User Name", granted_role from DBA_ROLE_PRIVS where GRANTED_ROLE in ('CONNECT','APPUSER'); 

,如果你需要爲每個用戶一個行和兩個列的每個訪問,您可以使用此

select c.GRANTEE as "User Name", a.granted_role as "Connect", c.granted_role as "APPUSER" 
FROM 
(SELECT GRANTEE, granted_role from DBA_ROLE_PRIVS where GRANTED_ROLE = 'CONNECT') a, 

FULL OUTER JOIN (其中授予select GRANTEE,granted_role從DBA_ROLE_PRIVS _ROLE ='APPUSER')c on a.GRANTEE = c.GRANTEE;

+0

這確實結合了我的兩個查詢,我感謝你。但是,它仍然會列出兩次「Bob」和「Nick」,並且只有兩列。我真的想找到一種有三排的方式。首先是用戶名,如果他們擁有'連接'權限,則持續用戶擁有'應用用戶'權限。 –

+0

根據您的需要更新了答案。我已經寫在記事本檢查任何語法錯字,它應該工作 – Panther

+0

我已經更新了你的答案,我正確地產生答案的東西。它似乎只顯示擁有'CONNECT'和'APPUSER'權限的用戶。它不會僅向用戶顯示一項權利。謝謝@Panther –