REVOKE

REVOKE (REVOKE)

접근 권한을 제거하는 명령이에요. 이전에 하나 이상의 역할(role)에 부여된 권한을 회수해요.

출처: PostgreSQL 문서

본문

개요 (Synopsis)

REVOKE [ GRANT OPTION FOR ]
    { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | MAINTAIN }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { [ TABLE ] table_name [, ...]
         | ALL TABLES IN SCHEMA schema_name [, ...] }
    FROM role_specification [, ...]
    [ GRANTED BY role_specification ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )
    [, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) }
    ON [ TABLE ] table_name [, ...]
    FROM role_specification [, ...]
    [ GRANTED BY role_specification ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { USAGE | SELECT | UPDATE }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { SEQUENCE sequence_name [, ...]
         | ALL SEQUENCES IN SCHEMA schema_name [, ...] }
    FROM role_specification [, ...]
    [ GRANTED BY role_specification ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
    ON DATABASE database_name [, ...]
    FROM role_specification [, ...]
    [ GRANTED BY role_specification ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON DOMAIN domain_name [, ...]
    FROM role_specification [, ...]
    [ GRANTED BY role_specification ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON FOREIGN DATA WRAPPER fdw_name [, ...]
    FROM role_specification [, ...]
    [ GRANTED BY role_specification ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON FOREIGN SERVER server_name [, ...]
    FROM role_specification [, ...]
    [ GRANTED BY role_specification ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { EXECUTE | ALL [ PRIVILEGES ] }
    ON { { FUNCTION | PROCEDURE | ROUTINE } function_name [ ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) ] [, ...]
         | ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMA schema_name [, ...] }
    FROM role_specification [, ...]
    [ GRANTED BY role_specification ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON LANGUAGE lang_name [, ...]
    FROM role_specification [, ...]
    [ GRANTED BY role_specification ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
    ON LARGE OBJECT loid [, ...]
    FROM role_specification [, ...]
    [ GRANTED BY role_specification ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { SET | ALTER SYSTEM } [, ...] | ALL [ PRIVILEGES ] }
    ON PARAMETER configuration_parameter [, ...]
    FROM role_specification [, ...]
    [ GRANTED BY role_specification ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schema_name [, ...]
    FROM role_specification [, ...]
    [ GRANTED BY role_specification ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { CREATE | ALL [ PRIVILEGES ] }
    ON TABLESPACE tablespace_name [, ...]
    FROM role_specification [, ...]
    [ GRANTED BY role_specification ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON TYPE type_name [, ...]
    FROM role_specification [, ...]
    [ GRANTED BY role_specification ]
    [ CASCADE | RESTRICT ]

REVOKE [ { ADMIN | INHERIT | SET } OPTION FOR ]
    role_name [, ...] FROM role_specification [, ...]
    [ GRANTED BY role_specification ]
    [ CASCADE | RESTRICT ]

여기서 role_specification은 다음 중 하나예요:

    [ GROUP ] role_name
  | PUBLIC
  | CURRENT_ROLE
  | CURRENT_USER
  | SESSION_USER

설명 (Description)

REVOKE 명령은 하나 이상의 역할에 이전에 부여된 권한을 회수해요. 키워드 PUBLIC은 모든 역할의 암시적으로 정의된 그룹을 가리켜요.

권한 유형의 의미는 GRANT 명령의 설명을 참고하세요.

특정 역할은 자신에게 직접 부여된 권한, 자신이 현재 멤버인 역할에 부여된 권한, 그리고 PUBLIC에게 부여된 권한의 합을 가진다는 점에 유의하세요. 따라서 예를 들어 PUBLIC에서 SELECT 권한을 회수한다고 해서 반드시 모든 역할이 객체에 대한 SELECT 권한을 잃는다는 뜻은 아니에요. 직접 또는 다른 역할을 통해 부여받은 사람은 여전히 그것을 가질 거예요. 마찬가지로 사용자에게서 SELECT를 회수해도, PUBLIC이나 다른 멤버십 역할이 여전히 SELECT 권한을 가지면 그 사용자가 SELECT를 못 쓰게 하는 것은 아닐 수 있어요.

GRANT OPTION FOR가 지정되면 권한 자체가 아니라 권한에 대한 grant option만 회수돼요. 그렇지 않으면 권한과 grant option이 모두 회수돼요.

사용자가 grant option이 있는 권한을 보유하고 다른 사용자에게 그것을 부여했다면, 그 다른 사용자들이 보유한 권한을 의존 권한(dependent privileges)이라고 불러요. 첫 번째 사용자가 보유한 권한이나 grant option이 회수되고 의존 권한이 존재하면, CASCADE가 지정되면 그 의존 권한들도 회수돼요. 지정되지 않으면 revoke 동작은 실패해요. 이 재귀적 회수는 이 REVOKE 명령의 주체인 사용자에게 추적 가능한 사용자 체인을 통해 부여된 권한에만 영향을 줘요. 따라서 다른 사용자들을 통해서도 부여됐다면 영향을 받는 사용자는 사실상 그 권한을 유지할 수 있어요.

테이블에서 권한을 회수할 때, 해당 테이블의 각 컬럼에 대한 대응하는 컬럼 권한(있으면)도 자동으로 회수돼요. 반면 역할이 테이블에서 권한을 부여받았다면, 개별 컬럼에서 같은 권한을 회수해도 아무 효과가 없어요.

역할의 멤버십을 회수할 때는 GRANT OPTION 대신 ADMIN OPTION이라고 부르지만, 동작은 비슷해요. PostgreSQL 16 이전 릴리스에서는 역할 멤버십 부여에 대해 의존 권한이 추적되지 않아 CASCADE가 역할 멤버십에 효과가 없었다는 점에 유의하세요. 이제는 그렇지 않아요. 또한 이 형태의 명령은 *role_specification*에서 잡음 단어 GROUP을 허용하지 않는다는 점에도 주의하세요.

기존 역할 부여에서 ADMIN OPTION을 제거할 수 있는 것처럼, INHERIT OPTION이나 SET OPTION도 회수할 수 있어요. 이는 해당 옵션의 값을 FALSE로 설정하는 것과 동일해요.

참고 (Notes)

사용자는 자신이 직접 부여한 권한만 회수할 수 있어요. 예를 들어 사용자 A가 grant option과 함께 권한을 사용자 B에게 부여했고, B가 다시 그것을 사용자 C에게 부여했다면, A는 C에게서 그 권한을 직접 회수할 수 없어요. 대신 A는 B로부터 grant option을 회수하고 CASCADE 옵션을 사용해 그 권한이 C로부터도 회수되게 할 수 있어요. 또 다른 예로, A와 B가 모두 C에게 같은 권한을 부여했다면, A는 자신의 부여만 회수할 수 있고 B의 부여는 회수할 수 없으므로, C는 사실상 그 권한을 계속 가질 거예요.

객체의 비소유자가 그 객체에 대한 권한을 REVOKE하려고 하면, 그 사용자가 객체에 대해 아무 권한도 없을 경우 명령은 완전히 실패해요. 어떤 권한이라도 있으면 명령은 진행되지만, 사용자가 grant option을 가진 권한만 회수해요. REVOKE ALL PRIVILEGES 형태는 grant option을 전혀 보유하지 않으면 경고 메시지를 내고, 다른 형태들은 명령에서 구체적으로 이름이 지정된 권한 중 어떤 것에 대한 grant option도 보유하지 않으면 경고를 내요. (원칙적으로 이 문장들은 객체 소유자에게도 적용되지만, 소유자는 항상 모든 grant option을 보유한 것으로 취급되므로 그 경우는 결코 발생할 수 없어요.)

수퍼유저가 GRANT 또는 REVOKE 명령을 발행하기로 선택하면, 그 명령은 마치 영향받는 객체의 소유자가 발행한 것처럼 수행돼요. (역할에는 소유자가 없으므로, 역할 멤버십의 GRANT의 경우 명령은 마치 bootstrap superuser가 발행한 것처럼 수행돼요.) 모든 권한은 궁극적으로 객체 소유자에게서 나오므로(아마 grant option 체인을 통해 간접적으로), 수퍼유저가 모든 권한을 회수할 수는 있지만, 이는 위에서 말한 대로 CASCADE의 사용을 요구할 수 있어요.

REVOKE는 영향받는 객체의 소유자가 아니지만, 그 객체를 소유한 역할의 멤버이거나, 그 객체에 WITH GRANT OPTION 권한을 보유한 역할의 멤버인 역할에 의해서도 수행될 수 있어요. 이 경우 명령은 실제로 객체를 소유하거나 WITH GRANT OPTION 권한을 보유한 포함 역할이 발행한 것처럼 수행돼요. 예를 들어 테이블 t1이 역할 g1에 의해 소유되고 그 역할의 멤버가 역할 u1이라면, u1g1이 부여한 것으로 기록된 t1에 대한 권한을 회수할 수 있어요. 여기에는 u1 및 역할 g1의 다른 멤버들이 한 부여도 포함돼요.

REVOKE를 실행하는 역할이 둘 이상의 역할 멤버십 경로를 통해 권한을 간접적으로 보유한다면, 명령을 수행하는 데 어떤 포함 역할이 사용될지는 명시되어 있지 않아요. 이런 경우에는 SET ROLEREVOKE를 수행하고 싶은 특정 역할이 되는 것이 모범 사례예요. 그렇게 하지 않으면 의도한 권한이 아닌 다른 권한을 회수하거나, 아무것도 회수하지 못할 수 있어요.

특정 권한 유형과 객체의 권한을 검사하는 방법에 대한 자세한 내용은 Section 5.8을 참고하세요.

예시 (Examples)

테이블 films에 대한 public의 insert 권한을 회수해요:

REVOKE INSERT ON films FROM PUBLIC;

kinds에 대한 사용자 manuel의 모든 권한을 회수해요:

REVOKE ALL PRIVILEGES ON kinds FROM manuel;

이것은 실제로 "내가 부여한 모든 권한을 회수"한다는 뜻이에요.

역할 admins에서 사용자 joe의 멤버십을 회수해요:

REVOKE admins FROM joe;

호환성 (Compatibility)

GRANT 명령의 호환성 참고 사항이 REVOKE에도 유사하게 적용돼요. 표준에 따르면 키워드 RESTRICT 또는 CASCADE가 필수지만, PostgreSQL은 기본적으로 RESTRICT를 가정해요.

더 알아보기 (Learn more)