Home 신규 프로젝트에서 Db 스키마관리를 위한 권한분리
Post
Cancel

신규 프로젝트에서 Db 스키마관리를 위한 권한분리

사업을 수주받아서 새로운 프로그램을 밑바닥 부터 만든다고 생각해보자.

문서상으로는 요구사항을 정리하고, 일정을 추산하고, 개발 인력을 확보한다.
그리고 기술적으로는 아키텍쳐나 데이터베이스의 구조를 설계한다.

마침내 모든 설계 과정을 마치고 본격적으로 개발을 시작할 수 있게 된다.

하지만, 이따금씩 설계 단계에서 놓친 부분이 발견되어 부족한 부분을 보충하기로 한다.
데이터베이스의 테이블이나 컬럼을 추가하는 것은 흔하게 있는 일이다.

그러면 여기서 부터 문제가 발생하게 된다.

설계 단계에서는 데이터베이스에 어떤 테이블과 컬럼을 사용하겠다고 이미 데이터베이스 정의 문서 작성을 완료했는데, 테이블이나 컬럼이 추가되었다는 것은 설계문서와 실제 데이터베이스의 구조가 달라졌다는 것을 의미한다.
테이블을 추가하지 못하게 막을 수는 없기 때문에 데이터베이스 정의서를 새로 추가한 테이블을 포함하여 최신 내용으로 갱신해야 한다.

그런데 개발자는 한 명이 아니다. 여러 명의 개발자가 각자 자기 맡은 분야에서 개발을 하다보면 동일한 역할을 하는 테이블을 중복해서 만들거나, 조인하는 컬럼의 이름을 어울리지 않게 지어 식별하기 어렵게 만드는 일이 자주 생긴다.
무엇보다도 심각한 문제는, 개발하는데에 심취해서 테이블을 변경한 내용을 알려주지 않는 것이다.

누군가는 데이터베이스 문서와 실제 스키마가 일치하도록 관리해야하는데 관리하는 사람은 한 명이고 테이블 만드는 사람은 여러명이기 때문에 무조건 불일치가 생길 수 밖에 없다.
분명히 테이블 만들고나서 테이블 이름을 알려달라고 얘기했지만 그 조차도 하지 않는데, 문서를 수정하는 것을 기대할 수는 없다.

분명히 내가 데이터베이스를 설계했고 데이터베이스 문서를 관리하고 있는데 내가 모르는 테이블을 마주하는 상황을 몇 번 마주하게 되면 결국에는 내가 총대매고 데이터베이스 조작을 통제해야한다는 결론에 도달하게 된다.

그래서 데이터베이스 조작을 통제하는 방법에 대하여 고민하게 되었다.
그 당시에는 조작통제에 대한 지식이나 경험이 없고, 주어진 기간 내에 빨리 개발을 마쳐야 하기 때문에 당장에 조작통제를 시작할 수는 없었지만, 훗날 동일한 상황이 벌어질 것은 매우 뻔한 일이었기 때문에 접근을 통제하는 방법을 미리 찾아서 나중에 써먹어야 겠다는 생각으로 이 글을 작성하게 되었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE USER ADMIN IDENTIFIED BY 1234; -- 실제 DB객체를 소유하는 user생성
CREATE USER DEVELOPER IDENTIFIED BY 1234; -- 다른 개발자들에게 알려줄 개발용 user생성

-- ADMIN 유저에게 필요한 객체를 모두 생성했다고 가정

GRANT CREATE SESSION TO DEVELOPER; 

GRANT CREATE SYNONYM TO DEVELOPER;

-- ADMIN에서 실행
SELECT 'GRANT INSERT, SELECT, UPDATE, DELETE ON ' || OBJECT_NAME || ' TO DEVELOPER;' FROM USER_OBJECTS WHERE OBJECT_TYPE IN ('TABLE', 'VIEW'); -- 테이블,뷰 접근 허용
GRANT SELECT ANY SEQUENCE TO DEVELOPER;
GRANT EXECUTE ANY PROCEDURE TO DEVELOPER;
GRANT ALTER ANY PROCEDURE TO DEVELOPER; -- GRANT PROCEDURE는 GRANT FUNCTION을 포함한다.
GRANT ALTER ANY TRIGGER TO DEVELOPER;
GRANT MANAGE SCHEDULER TO DEVELOPER;
GRANT CREATE ANY INDEX TO DEVELOPER;
GRANT ALTER ANY INDEX TO DEVELOPER;
GRANT DROP ANY INDEX TO DEVELOPER;

SELECT 'CREATE OR REPLACE PUBLIC SYNONYM ' || OBJECT_NAME || ' FOR ADMIN.' || OBJECT_NAME || ';' FROM USER_OBJECTS WHERE OBJECT_TYPE IN ('TABLE', 'VIEW', 'FUNCTION', 'PROCEDURE', 'TRIGGER');

자주 사용할 만한 것들을 추렸다. 이 외에 더 필요한 것이 있으면 아래 링크를 참조하여 권한을 부여하고 synonym을 추가하면 된다.

https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/GRANT.html

This post is licensed under CC BY 4.0 by the author.

Mybatis에서 Dynamic Query를 사용하는 방법

리눅스 자주 사용하는 명령어 설치하기