오라클 권한 관리
보통 프로젝트에서는 ROLE 관리를 잘 해야 DB 운영이 수월해진다.
유저, 테이블이 많기 때문에 유저에게 직접 테이블 권한을 할당하기 보다는
ROLE 을 만들고 각 USER 에게 ROLE을 부여한 후,
롤에게 테이블에 대한 권한을 주는게 관리에 용이하다.
(1) TBS 생성
(2) USER 생성 (이때 TBS QUOTOS 등 정의해준다.), 권한 부여
-- 1,2 번은 앞선 게시글에 적어뒀음
(3) ROLE 생성 (CREATE ROLE)
create role 롤이름A;
(4) ROLE에 권한 할당 (GRANT)
grant 권한이름X, 권한이름Y, ... to 롤이름A;
--어려우니 코드로 보자면 테이블, 시퀀스 등에 권한을 주면 된다.
--EX)
GRANT SELECT,INSERT,UPDATE,DELETE ON OWNER.FB_FRMLAND_DDD TO RL_ALL;
GRANT SELECT ON OWNER.FB_FRMLAND_DDD TO RL_SEL;
(5) 사용자에 ROLE 부여 (GRANT)
사실 4,5 번 순서 바뀌어도 사오간 없음
grant 역할이름A to 사용자이름K;
-- 아래역시 예시
GRANT RL_ALL TO ABALL;
GRANT RL_SEL TO ABSEL;
(6) 사용자에게 부여된 ROLE 확인 (데이터 익셔너리 dba_role_privs 사용)
select * from dba_role_privs
where grantee='사용자이름K';
SELECT * FROM DBA_ROLE_PRIVS
WHERE GRANTEE ='BBDEV'
-- 조회하면 BBDEV에게 부여된 롤을 확인할 수 있다.
--반대로
SELECT *
FROM DBA_ROLE_PRIVS
WHERE GRANTED_ROLE = 'RL_ABALL' ;
--이렇게 조회하면 이 롤을 가지고 있는 모든 USER 을 조회할 수 있다.
(7) 일반적으로 개발단계에서 롤에 권한을 부여할 때 SYNONYM을 같이 부여한다.
GRANT SELECT,INSERT,UPDATE,DELETE ON IGWOWN.FB_FRMLND_DDD TO RL_ALL;
CREATE OR REPLACE PUBLIC SYNONYM FB_FRMLND_DDD FOR OWNER.FB_FRMLND_DDD ;
그리고 중요한거 !!
롤이 테이블에 대해 가지고 있는 권한을 조회하고 싶은데
보통 SELECT,INSERT,UPDATE,DELETE가 따로따로 나와서 가독성이 좋지않다.
SELECT *
FROM DBA_TAB_PRIVS
WHERE OWNER = 'OWNER' ;
--위처럼 조회하면 진짜 보기 힘들다. 그래서 LISTAGG로 만들어준다!
SELECT GRANTEE, OWNER, TABLE_NAME, GRANTOR
, LISTAGG(PRIVILEGE,',') WITHIN GROUP(ORDER BY
CASE WHEN PRIVILEGE = 'SELECT' THEN 1
WHEN PRIVILEGE = 'INSERT' THEN 2
WHEN PRIVILEGE = 'UPDATE' THEN 3
ELSE 4
END
) AS "PRIVILEGE"
FROM DBA_TAB_PRIVS
WHERE 1=1
AND TABLE_NAME NOT LIKE 'BIN%'
GROUP BY GRANTEE, OWNER, TABLE_NAME, GRANTOR
ORDER BY TABLE_NAME
, CASE WHEN GRANTEE LIKE '%ALL' THEN 1
ELSE 2
END
, GRANTEE;
위 쿼리로 CREATE VIEW 해주면 가독성 좋은 테이블에 부여된 롤 권한을 보다 쉽게 볼 수 있다 ~
CREATE VIEW VW_DBA_TAB_PRIVS
AS
SELECT GRANTEE, OWNER, TABLE_NAME, GRANTOR
, LISTAGG(PRIVILEGE,',') WITHIN GROUP(ORDER BY
CASE WHEN PRIVILEGE = 'SELECT' THEN 1
WHEN PRIVILEGE = 'INSERT' THEN 2
WHEN PRIVILEGE = 'UPDATE' THEN 3
ELSE 4
END
) AS "PRIVILEGE"
FROM DBA_TAB_PRIVS
WHERE 1=1
AND TABLE_NAME NOT LIKE 'BIN%'
GROUP BY GRANTEE, OWNER, TABLE_NAME, GRANTOR
ORDER BY TABLE_NAME
, CASE WHEN GRANTEE LIKE '%ALL' THEN 1
ELSE 2
END
, GRANTEE;
'새싹 DBA > Oracle' 카테고리의 다른 글
[오라클] impdp 작업 중 ORA-56935: existing datapump jobs are using a different version of time zone data file (0) | 2024.06.28 |
---|---|
[오라클] SEQUENCE 시퀀스 생성, 권한, SYNONYM 까지 (0) | 2024.06.26 |
[오라클] DB LINK로 dumpfile 없이 impdp (0) | 2024.06.24 |
[오라클] DB LINK 생성 방법 / DB LINK로 원격에서 데이터 불러오기 expdp (0) | 2024.06.21 |
[오라클] DATAPUMP로 개발DB → 전환DB 같은 환경 구축하기 (0) | 2024.06.21 |