SET ROLE
SET ROLE (SET ROLE)
현재 세션의 현재 사용자 식별자를 설정하는 명령이에요. SET ROLE을 실행하면 SQL 명령에 대한 권한 검사가 마치 그 역할(role)이 원래 로그인한 사용자인 것처럼 수행돼요.
출처: PostgreSQL 문서
본문
개요 (Synopsis)
SET [ SESSION | LOCAL ] ROLE role_name
SET [ SESSION | LOCAL ] ROLE NONE
RESET ROLE
설명 (Description)
이 명령은 현재 SQL 세션의 현재 사용자 식별자를 *role_name*으로 설정해요. 역할 이름은 식별자나 문자열 리터럴 어느 쪽으로도 쓸 수 있어요. SET ROLE을 실행한 뒤에는 SQL 명령에 대한 권한 검사가 마치 지정된 역할이 원래 로그인한 것처럼 수행돼요. SET ROLE과 SET SESSION AUTHORIZATION은 예외라는 점에 주의하세요. 이 둘에 대한 권한 검사는 각각 현재 세션 사용자와 초기 세션 사용자(즉 인증된 사용자)를 계속 사용해요.
현재 세션 사용자는 지정된 *role_name*에 대한 SET 옵션을, SET 옵션이 있는 멤버십 체인을 통해 직접적으로든 간접적으로든 가져야 해요. (세션 사용자가 수퍼유저면 아무 역할이나 선택할 수 있어요.)
SESSION과 LOCAL 수정자는 일반 SET 명령과 같은 방식으로 동작해요.
SET ROLE NONE은 현재 사용자 식별자를 session_user가 반환하는 현재 세션 사용자 식별자로 설정해요. RESET ROLE은 현재 사용자 식별자를 명령줄 옵션, ALTER ROLE, 또는 ALTER DATABASE이 지정한 연결 시점 설정으로 설정해요. 그런 설정이 없다면 RESET ROLE은 현재 사용자 식별자를 현재 세션 사용자 식별자로 설정해요. 이 형태는 아무 사용자나 실행할 수 있어요.
참고 (Notes)
이 명령으로 권한을 추가하거나 제한할 수 있어요. 세션 사용자 역할이 WITH INHERIT TRUE로 멤버십을 부여받았다면, 그 역할은 그러한 모든 역할의 권한을 자동으로 가져요. 이 경우 SET ROLE은 대상 역할이 직접 보유하거나 상속하는 권한 외에는 모두 효과적으로 버려요. 반면 세션 사용자 역할이 WITH INHERIT FALSE로 멤버십을 부여받았다면, 부여된 역할의 권한은 기본적으로 접근할 수 없어요. 다만 역할이 WITH SET TRUE로 부여됐다면, 세션 사용자는 SET ROLE로 세션 사용자에게 직접 부여된 권한을 버리고 대신 지정된 역할이 사용 가능한 권한을 획득할 수 있어요. 역할이 WITH INHERIT FALSE, SET FALSE로 부여됐다면 그 역할의 권한은 SET ROLE을 쓰든 안 쓰든 행사할 수 없어요.
SET ROLE은 SET SESSION AUTHORIZATION과 비슷한 효과를 내지만, 관련된 권한 검사는 아주 달라요. 또한 SET SESSION AUTHORIZATION은 이후 SET ROLE 명령에서 허용되는 역할을 결정하지만, SET ROLE로 역할을 바꾸는 것은 이후 SET ROLE에 허용되는 역할 집합을 바꾸지 않아요.
SET ROLE은 역할의 ALTER ROLE 설정이 지정하는 세션 변수를 처리하지 않아요. 이는 로그인 시에만 일어나요.
SET ROLE은 SECURITY DEFINER 함수 안에서는 사용할 수 없어요.
예시 (Examples)
SELECT SESSION_USER, CURRENT_USER;
session_user | current_user
--------------+--------------
peter | peter
SET ROLE 'paul';
SELECT SESSION_USER, CURRENT_USER;
session_user | current_user
--------------+--------------
peter | paul
호환성 (Compatibility)
PostgreSQL은 식별자 구문("rolename)을 허용하는 반면, SQL 표준은 역할 이름을 문자열 리터럴로 쓰도록 요구해요. SQL은 트랜잭션 중에는 이 명령을 허용하지 않지만, PostgreSQL은 그렇게 할 이유가 없어서 그 제한을 두지 않아요. SESSION과 LOCAL 수정자와 RESET 구문은 PostgreSQL 확장 기능이에요.