본문 바로가기

Troubleshooting

[권한] SQL5193N (workload:sysdefaultuserworkload)

고객사 지원 시, DB2 계정 정책은 DB 레벨에서 설정한다.

설치 작업만 하는 경우는 대부분 고객사에서 인스턴스 계정으로 업무용으로도 사용하는 것 같고, 프로젝트 업무를 지원하게 되면 테이블 공간까지 정의를 하면서 계정 정책을 수립하게 된다.

보통은 DBADM 권한을 부여해서 사용하기에 크게 문제가 되지 않았는데, DBADM 권한을 주지 않고 더 약한 권한을 주는 경우 다음과 같은 문제를 겪을 수 있다.

필자의 경우는 V10.1 에서 겪은 문제이나, 그 이하 버전에서도 접할 가능성이 있어 보인다.

계정 생성

db2 “grant CONNECT,DATAACCESS on database to USER db2user

테이블 조회

db2 connect to sample user db2user using db2user
db2 "select count(1) from 스키마명.employee"
SQL5193N  The current session user does not have usage privilege on any enabled workloads.  SQLSTATE=42524

(참고) 본 테스트는 약간 시나리오가 인위적으로 구성되어서 테스트해본다면 재현되지 않을 수 있다.

위 문제로 해당 테이블에 테이블 레벨 권한을 부여(INDEX,INSERT,SELECT,UPDATE,DELETE) 했으나 동일한 메시지가 반환되었다.

문제는 DB2가 기본적으로 제공하는 Workload 때문이였다.

아래처럼 2개의 workload가 DB가 생성되는 시점에 생성된다. Admin용 워크로드와, User용 워크로드…

db2 "select substr(workloadname,1,30) wlname from syscat.workloads"

WLNAME
------------------------------
SYSDEFAULTUSERWORKLOAD
SYSDEFAULTADMWORKLOAD

 

db2 "select substr(a.workloadname,1,30) wlname,substr(b.grantor,1,20) grantor, substr(b.grantee,1,20) grantee, b.granteetype,usageauth from syscat.workloads a, syscat.workloadauth b where a.workloadid=b.workloadid"

WLNAME                         GRANTOR              GRANTEE              GRANTEETYPE USAGEAUTH
------------------------------ -------------------- -------------------- ----------- ---------
SYSDEFAULTUSERWORKLOAD        SYSIBM               PUBLIC               G           Y

 

문제가 난 시점에는 위 script를 조회하지 않아 정확히 설정된 값이 어떻게 되어 있는지 모르지만, 예측하기로는 SysDefaultUserWorkload의  GRANTEE가 PUBLIC 으로 되어 있지 않았을 것 같다.

(V9.1 부터 제공되는 DB 생성시 restrictive 옵션과 V9.5에서 제공된 Default Workload 영향으로 위 값는 상황에 따라 다를 수 있을 것 같다. 위 문제가 발생한 DB는 restrictive 옵션을 주면서 DB를 생성하였다.)

 

V9.7 정보센터의 내용을 살펴보니 다음과 같이 정의되어 있다.

기본 사용자 워크로드 : DB 서버에 접속 시 모든 접속에 대해 적용되는 워크로드

기본 관리자 워크로드 : 관리작업을 수행할 때 허용하게 할지 말지를 결정하는 워크로드

 

그래서 위의 문제는 다음과 같이 권한 부여를 하여 정상 실행됨을 확인하였다.

db2 “grant usage on workload sysdefaultuserworkload to user db2user

 

db2 connect to sample user db2user using db2user

db2 "select count(1) from db2inst1.employee"

1
-----------
         42

  1 record(s) selected.