Oracle에서 사용자의 모든 권한을 표시하는 방법
sql-console에서 특정 사용자의 모든 권한/규칙을 표시하는 방법을 알려주시겠습니까?
아래 보기를 사용해 볼 수 있습니다.
SELECT * FROM USER_SYS_PRIVS;
SELECT * FROM USER_TAB_PRIVS;
SELECT * FROM USER_ROLE_PRIVS;
DBA 및 기타 파워 유저는 다음 명령을 사용하여 다른 사용자에게 부여된 권한을 찾을 수 있습니다.DBA_
동일한 보기의 버전입니다.이 매뉴얼에 기재되어 있습니다.
이러한 보기는 사용자에게 직접 부여된 권한만 표시합니다.역할을 통해 간접적으로 부여된 권한을 포함하여 모든 권한을 찾으려면 보다 복잡한 재귀 SQL 문이 필요합니다.
select * from dba_role_privs connect by prior granted_role = grantee start with grantee = '&USER' order by 1,2,3;
select * from dba_sys_privs where grantee = '&USER' or grantee in (select granted_role from dba_role_privs connect by prior granted_role = grantee start with grantee = '&USER') order by 1,2,3;
select * from dba_tab_privs where grantee = '&USER' or grantee in (select granted_role from dba_role_privs connect by prior granted_role = grantee start with grantee = '&USER') order by 1,2,3,4;
당신이 얼마나 미쳐가고 싶은지에 따라 그것을 할 수 있는 다양한 스크립트가 떠돌고 있다.저는 개인적으로 Pete Finnigan의 find_all_privs 스크립트를 사용합니다.
직접 작성하려면 쿼리가 상당히 까다로워집니다.사용자에게 시스템 권한을 부여할 수 있습니다.이 권한은 에 표시됩니다.DBA_SYS_PRIVS
. 오브젝트 특권을 부여할 수 있습니다.이 특권은 에 표시됩니다.DBA_TAB_PRIVS
또한 역할도 부여받을 수 있습니다.DBA_ROLE_PRIVS
(기본값이든 비기본값이든 비밀번호가 필요할 수 있습니다.따라서 사용자에게 역할이 부여되었다고 해서 사용자가 해당 역할을 통해 취득한 권한을 기본적으로 사용할 수 있는 것은 아닙니다.)그러나 이러한 역할에는 시스템 권한, 오브젝트 권한 및 추가 역할이 부여될 수 있습니다.이 권한은 다음을 참조하십시오.ROLE_SYS_PRIVS
,ROLE_TAB_PRIVS
,그리고.ROLE_ROLE_PRIVS
Pete의 스크립트는 이러한 관계를 통해 사용자에게 전달되는 모든 특권을 보여줍니다.
또 다른 유용한 리소스:
http://psoug.org/reference/roles.html
- DBA_SYS_PRIVS
- DBA_TAB_PRIVS
- DBA_ROLE_PRIVS
Raviteja Vutukuri의 답변은 빠르고 효과적이지만 필터를 변경하는 데는 그다지 유연하지 않으며 프로그래밍 방식으로 작업을 수행하려는 경우에는 그다지 도움이 되지 않습니다.그래서 저는 저만의 질문을 정리했습니다.
SELECT
PRIVILEGE,
OBJ_OWNER,
OBJ_NAME,
USERNAME,
LISTAGG(GRANT_TARGET, ',') WITHIN GROUP (ORDER BY GRANT_TARGET) AS GRANT_SOURCES, -- Lists the sources of the permission
MAX(ADMIN_OR_GRANT_OPT) AS ADMIN_OR_GRANT_OPT, -- MAX acts as a Boolean OR by picking 'YES' over 'NO'
MAX(HIERARCHY_OPT) AS HIERARCHY_OPT -- MAX acts as a Boolean OR by picking 'YES' over 'NO'
FROM (
-- Gets all roles a user has, even inherited ones
WITH ALL_ROLES_FOR_USER AS (
SELECT DISTINCT CONNECT_BY_ROOT GRANTEE AS GRANTED_USER, GRANTED_ROLE
FROM DBA_ROLE_PRIVS
CONNECT BY GRANTEE = PRIOR GRANTED_ROLE
)
SELECT
PRIVILEGE,
OBJ_OWNER,
OBJ_NAME,
USERNAME,
REPLACE(GRANT_TARGET, USERNAME, 'Direct to user') AS GRANT_TARGET,
ADMIN_OR_GRANT_OPT,
HIERARCHY_OPT
FROM (
-- System privileges granted directly to users
SELECT PRIVILEGE, NULL AS OBJ_OWNER, NULL AS OBJ_NAME, GRANTEE AS USERNAME, GRANTEE AS GRANT_TARGET, ADMIN_OPTION AS ADMIN_OR_GRANT_OPT, NULL AS HIERARCHY_OPT
FROM DBA_SYS_PRIVS
WHERE GRANTEE IN (SELECT USERNAME FROM DBA_USERS)
UNION ALL
-- System privileges granted users through roles
SELECT PRIVILEGE, NULL AS OBJ_OWNER, NULL AS OBJ_NAME, ALL_ROLES_FOR_USER.GRANTED_USER AS USERNAME, GRANTEE AS GRANT_TARGET, ADMIN_OPTION AS ADMIN_OR_GRANT_OPT, NULL AS HIERARCHY_OPT
FROM DBA_SYS_PRIVS
JOIN ALL_ROLES_FOR_USER ON ALL_ROLES_FOR_USER.GRANTED_ROLE = DBA_SYS_PRIVS.GRANTEE
UNION ALL
-- Object privileges granted directly to users
SELECT PRIVILEGE, OWNER AS OBJ_OWNER, TABLE_NAME AS OBJ_NAME, GRANTEE AS USERNAME, GRANTEE AS GRANT_TARGET, GRANTABLE, HIERARCHY
FROM DBA_TAB_PRIVS
WHERE GRANTEE IN (SELECT USERNAME FROM DBA_USERS)
UNION ALL
-- Object privileges granted users through roles
SELECT PRIVILEGE, OWNER AS OBJ_OWNER, TABLE_NAME AS OBJ_NAME, ALL_ROLES_FOR_USER.GRANTED_USER AS USERNAME, ALL_ROLES_FOR_USER.GRANTED_ROLE AS GRANT_TARGET, GRANTABLE, HIERARCHY
FROM DBA_TAB_PRIVS
JOIN ALL_ROLES_FOR_USER ON ALL_ROLES_FOR_USER.GRANTED_ROLE = DBA_TAB_PRIVS.GRANTEE
) ALL_USER_PRIVS
-- Adjust your filter here
WHERE USERNAME = 'USER_NAME'
) DISTINCT_USER_PRIVS
GROUP BY
PRIVILEGE,
OBJ_OWNER,
OBJ_NAME,
USERNAME
;
장점:
- 오브젝트, 특권, 특정 역할에 의한 정보 등 다양한 정보를 쉽게 필터링할 수 있습니다.
WHERE
절을 클릭합니다. - 단 하나의 질문으로, 제가 정신적으로 결과를 종합할 필요가 없습니다.
- 그러면 권한을 부여할 수 있는지 여부와 권한의 다른 소스 간에 하위 개체(계층적 부분)에 대한 권한이 포함되어 있는지 여부가 해결됩니다.
- 특권의 모든 소스가 표시되므로 특권을 취소하기 위해 필요한 모든 작업을 쉽게 볼 수 있습니다.
- 테이블과 시스템 권한을 하나의 일관성 있는 뷰로 결합하여 사용자의 모든 권한을 한 번에 나열할 수 있습니다.
- 이것은 쿼리이지, 이 모든 것을 전달해 주는 함수가 아닙니다.
DBMS_OUTPUT
(Pete Finnigan ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()이를 통해 프로그램 사용 및 내보내기에 유용합니다. - 필터는 반복되지 않고 1회만 표시됩니다.이를 통해 변경하기가 쉬워집니다.
- 가 필요한 할 수 .
GRANT
.
단일 쿼리 오라클 버전이 더 단순합니다.
WITH data
AS (SELECT granted_role
FROM dba_role_privs
CONNECT BY PRIOR granted_role = grantee
START WITH grantee = '&USER')
SELECT 'SYSTEM' typ,
grantee grantee,
privilege priv,
admin_option ad,
'--' tabnm,
'--' colnm,
'--' owner
FROM dba_sys_privs
WHERE grantee = '&USER'
OR grantee IN (SELECT granted_role
FROM data)
UNION
SELECT 'TABLE' typ,
grantee grantee,
privilege priv,
grantable ad,
table_name tabnm,
'--' colnm,
owner owner
FROM dba_tab_privs
WHERE grantee = '&USER'
OR grantee IN (SELECT granted_role
FROM data)
ORDER BY 1;
아래 코드를 사용하여 모든 사용자로부터 모든 권한 목록을 가져올 수 있습니다.
select * from dba_sys_privs
모든 권한을 표시하려면:
system_map에서 이름을 선택합니다.
언급URL : https://stackoverflow.com/questions/9811670/how-to-show-all-privileges-from-a-user-in-oracle
'programing' 카테고리의 다른 글
json_communications 함수: 특수 문자 (0) | 2023.02.23 |
---|---|
Oracle에서 CLOB와 BLOB의 차이점을 이해할 수 있도록 지원 (0) | 2023.02.23 |
리액트를 사용하여 여러 페이지 앱을 만드는 방법 (0) | 2023.02.23 |
WordPress Timber 사용자 지정 게시물 유형의 게시물 가져오기 (0) | 2023.02.23 |
Woocommerce 카트 어레이를 cat 및 sub cat별로 주문 (0) | 2023.02.23 |