공부/DATABASE

[SQL Server] 서비스 계정의 가장

무는빼주세요 2023. 3. 24. 15:16

DB를 운영하는 상황에서 계정별 권한 관리는 참 까다로운 것 같다.

SQL Server에서 Windows 계정이 아닌 서비스에서 접근하는 SQL 계정은 DDL 권한에 대하여 보수적으로 접근하게 된다.

하지만 모든 서비스의 흐름상 DDL이 없이 운영할 수 있는 건 아니었다.

 

서비스에서 테이블의 데이터를 특정 시점에 현재의 데이터로 동기화를 하여야하는 상황이었고 개발쪽에서는 해당 부분을 MERGE 구문을 이용하여 테이블 UPSERT를 통하여 처리하고자 하였다. 이러한 설계는 해당 테이블에 적절한 조건이 없을 경우 그리고 데이터 사이즈가 점점 증가할 수록 DB에는 부담이 가는 작업이 될 가능성이 높아지고 이는 서비스 지연과도 이어질 수 있다고 판단하였다.

 

이를 위해 방지하고자 DB 배치를 통하여 해당 테이블의 데이터를 삭제한 후 데이터를 넣자였고 DELETE로는 시간이 오래걸리니 동기화용 테이블을 만들어 해당 테이블의 데이터를 Truncate -> Insert -> Table Switching 으로 진행하고자 하였다. 

첫번째로 나온 문제점은 API를 통하여 데이터를 넣다보니 대부분 특정 시점(20분 단위)로 데이터가 들어가지만 완전히 정확하진 않다는 점이었다.

 

이 문제점을 해결하고자 SP 작성을 하였고 Truncate SP와 테이블 Switching SP를 제공하였다. 하지만 SQL 계정에서는 DDL 권한이 없는 상황이었고 이 작업으 ㄹ위해서만 그 계정에 권한을 넣기엔 적합하지 않았다.

마지막으로 진행한 과정은 해당 서비스에서는 알 수 없는 DDL 권한을 넣은 SQL 계정을 생성하였고 SP 내에서 EXECUTE AS를 통하여 계정을 가장하여 권한 문제 및 지연이 발생할 수 있는 부분을 방지하였다(impersonate 추가).

 

 

참조

https://learn.microsoft.com/ko-kr/sql/t-sql/statements/execute-as-transact-sql?view=sql-server-ver16 

 

EXECUTE AS(Transact-SQL) - SQL Server

EXECUTE AS(Transact-SQL)

learn.microsoft.com