Oracle Privilege Matrix - PullRequest
       10

Oracle Privilege Matrix

0 голосов
/ 05 июля 2018

Я хочу сделать матрицу привилегий в Oracle.

Это мой запрос:

SELECT 
    DTP.TABLE_NAME,  
    DECODE(DTP.PRIVILEGE, 'SELECT', 'YES', 'NO') "SELECT",
    DECODE(DTP.PRIVILEGE, 'INSERT', 'YES', 'NO') "INSERT",
    DECODE(DTP.PRIVILEGE, 'UPDATE', 'YES', 'NO') "UPDATE",
    DECODE(DTP.PRIVILEGE, 'DELETE', 'YES', 'NO') "DELETE",
    DECODE(DTP.PRIVILEGE, 'ALTER', 'YES', 'NO') "ALTER",
    DECODE(DTP.PRIVILEGE, 'EXECUTE', 'YES', 'NO') "EXECUTE"
FROM 
    SYS.DBA_TAB_PRIVS DTP
WHERE    
    DTP.GRANTEE = 'SUPPLIER'
    OR DTP.GRANTEE IN (SELECT DRP.GRANTED_ROLE
                       FROM dba_role_privs DRP
                       START WITH grantee = 'SUPPLIER'
                       CONNECT BY PRIOR DRP.GRANTED_ROLE = DRP.GRANTEE)
ORDER BY 
    TABLE_NAME 

и результат выглядит так:

TABLE_NAME | SELECT | INSERT | UPDATE | DELETE | ALTER | EXECUTE |
ACCOUNT    | YES    | NO     | NO     | NO     | NO    | NO      |
ACCOUNT    | NO     | YES    | NO     | NO     | NO    | NO      |
ACCOUNT    | NO     | no     | YES    | NO     | NO    | NO      |

Есть ли способы сделать так, чтобы результат стал таким?

TABLE_NAME | SELECT | INSERT | UPDATE | DELETE | ALTER | EXECUTE |
ACCOUNT    | YES    | YES    | YES    | NO     | NO    | NO      |

Спасибо

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Воспользуйтесь тем, что «ДА» сортирует после «НЕТ», и измените его следующим образом:

SELECT 
    DTP.TABLE_NAME,  
    MAX(DECODE(DTP.PRIVILEGE, 'SELECT', 'YES', 'NO')) "SELECT",
    MAX(DECODE(DTP.PRIVILEGE, 'INSERT', 'YES', 'NO')) "INSERT",
    MAX(DECODE(DTP.PRIVILEGE, 'UPDATE', 'YES', 'NO')) "UPDATE",
    MAX(DECODE(DTP.PRIVILEGE, 'DELETE', 'YES', 'NO')) "DELETE",
    MAX(DECODE(DTP.PRIVILEGE, 'ALTER', 'YES', 'NO')) "ALTER",
    MAX(DECODE(DTP.PRIVILEGE, 'EXECUTE', 'YES', 'NO')) "EXECUTE"
FROM 
    SYS.DBA_TAB_PRIVS DTP
WHERE    
    DTP.GRANTEE = 'SUPPLIER'
    OR DTP.GRANTEE IN (SELECT DRP.GRANTED_ROLE
                       FROM dba_role_privs DRP
                       START WITH grantee = 'SUPPLIER'
                       CONNECT BY PRIOR DRP.GRANTED_ROLE = DRP.GRANTEE)
GROUP BY DTP.TABLE_NAME                       
ORDER BY 
    TABLE_NAME 
0 голосов
/ 05 июля 2018

Используйте блок case с COUNT

SELECT DTP.TABLE_NAME,
    CASE WHEN COUNT( CASE WHEN DTP.PRIVILEGE = 'SELECT' THEN 1  END ) >= 1 THEN 'YES' ELSE 'NO' END as "SELECT",
    CASE WHEN COUNT( CASE WHEN DTP.PRIVILEGE = 'INSERT' THEN 1  END ) >= 1 THEN 'YES' ELSE 'NO' END as "INSERT",
    CASE WHEN COUNT( CASE WHEN DTP.PRIVILEGE = 'UPDATE' THEN 1  END ) >= 1 THEN 'YES' ELSE 'NO' END as "UPDATE",
    CASE WHEN COUNT( CASE WHEN DTP.PRIVILEGE = 'DELETE' THEN 1  END ) >= 1 THEN 'YES' ELSE 'NO' END as "DELETE",
    ..
    ..

    GROUP BY DTP.TABLE_NAME
...