PostgreSQL에서 사용자에게 권한 부여

Bilal Shahid 2024년2월15일
  1. PostgreSQL의 권한에 대한 간략한 소개
  2. PostgreSQL에서 GRANT 키워드 사용
PostgreSQL에서 사용자에게 권한 부여

PostgreSQL에서 테이블이나 뷰와 같은 모든 데이터베이스 개체에는 소유자가 있습니다. 소유자는 일반적으로 개체를 만든 사용자입니다.

결과적으로 소유자만이 자신이 생성한 개체를 수정하거나 삭제할 수 있는 권한을 가지며 다른 사용자는 기본적으로 그렇게 할 수 없습니다. 소유자가 다른 사용자가 객체에 대해 특정 작업을 수행할 수 있도록 허용하려면 권한을 부여해야 합니다.

이 자습서에서는 소유자가 PostgreSQL의 다른 사용자에게 모든 권한을 부여하는 방법을 보여줍니다. 기본 사항부터 시작하여 권한이 무엇인지 알아보겠습니다.

PostgreSQL의 권한에 대한 간략한 소개

권한은 특정 데이터베이스 개체와 관련된 권한입니다. PostgreSQL에는 다음과 같은 유형의 권한이 있습니다.

권한 이름 권한 설명
SELECT 테이블과 같은 개체의 열에서 모든 값을 선택할 수 있습니다.
INSERT 테이블에 데이터 행 삽입 허용
UPDATE 테이블의 기존 데이터 수정 허용
DELETE 테이블의 기존 데이터 삭제 허용
TRUNCATE 테이블에 행을 추가/추가할 수 있습니다.
REFERENCES 테이블에서 외래 키 참조 허용
TRIGGER 이벤트에 대한 트리거 생성 허용
CREATE 데이터베이스 내에서 다른 개체를 생성할 수 있습니다.
CONNECT 데이터베이스 서버와의 연결 설정 허용
TEMPORARY 임시 객체 선언 허용
EXECUTE 데이터베이스 내에서 쿼리 실행 허용
USAGE 데이터베이스 내의 개체 사용 정의

참고: 사용자에게 개체 DROP 권한을 부여하거나 해당 정의를 변경할 수 없습니다.

이러한 모든 권한은 사용자가 데이터베이스에서 수행할 수 있는 다양한 작업을 나타냅니다. 예를 들어, CREATE 권한이 부여되지 않은 경우 사용자는 특정 데이터베이스에서 테이블을 CREATE할 수 없습니다.

그렇다면 사용자에게 모든 권한을 어떻게 부여합니까? 예를 들어 다음 명령을 실행하여 임시 사용자를 생성해 보겠습니다.

CREATE USER myuser WITH PASSWORD 'password';

다음으로, 샘플 테이블을 만들고 일부 데이터로 채웁니다.

create table person(
    name varchar(30) not null,
    age int not null
);

insert into person values ('Ali', 20), ('Fatima', 19), ('Hassan', 22);

postgresql에서 사용자에게 권한 부여 - 출력 1

아래에 설명된 GRANT 키워드를 사용하여 사용자에게 모든 권한이 부여됩니다.

PostgreSQL에서 GRANT 키워드 사용

GRANT 키워드의 기본 구문은 다음과 같습니다.

GRANT privilege
ON object
TO {PUBLIC | GROUP group | username}

구문의 각 구성 요소를 하나씩 살펴보겠습니다.

  • privilege - 여기에서 사용자에게 부여할 권한을 작성합니다. 우리의 경우 모든 권한을 부여하는 방법을 배우고 있으므로 ALL PRIVILEGES라고 씁니다.
  • 개체 - 데이터베이스 개체에는 테이블, 뷰, 시퀀스, 데이터베이스, 함수, 프로시저 또는 스키마가 포함되지만 이에 국한되지 않습니다.
  • PUBLIC - 이 키워드를 작성하면 모든 역할 및 그룹의 모든 사용자에게 권한을 부여합니다.
  • GROUP - 그룹은 PostgreSQL의 역할 유형입니다. 역할은 데이터베이스 개체를 소유하는 그룹 또는 개별 사용자일 수 있습니다. 이름을 지정하여 PostgreSQL의 그룹에 모든 권한을 부여할 수 있습니다.
  • username - 개별 사용자에게 모든 권한을 부여하려면 여기에 username을 씁니다.

이제 예제를 통해 이 구문의 사용법을 보여드리겠습니다. 위에서 정의한 person 테이블에서 생성한 myuser에게 모든 권한을 부여한다고 가정합니다.

이를 위해 다음 쿼리를 실행할 수 있습니다.

GRANT ALL PRIVILEGES ON person TO myuser;

출력에는 다음 텍스트가 표시됩니다.

postgresql에서 사용자에게 권한 부여 - 출력 2

지정된 권한이 성공적으로 부여되었음을 의미합니다. PostgreSQL에서 위의 쿼리에 작성된 PRIVILEGES를 작성하는 것은 선택 사항입니다. 따라서 대안은 다음과 같습니다.

GRANT ALL ON person TO myuser;

또한 같은 방식으로 작동합니다. 마찬가지로 다른 데이터베이스 객체를 생성하고 사용자에게 모든 권한을 부여할 수도 있습니다. 예를 들어 샘플 절차를 작성해 보겠습니다.

create procedure just_an_example()
language plpgsql
as $$
begin
select * from person;
end; $$

이제 아래 쿼리를 실행하여 myuser에 대한 모든 권한을 부여할 수 있습니다.

GRANT ALL PRIVILEGES ON PROCEDURE just_an_example() TO myuser;

성공적으로 부여됩니다:

postgresql에서 사용자에게 권한 부여 - 출력 2

모든 권한을 부여하면서 WITH GRANT OPTION을 추가할 수도 있습니다. 이제 사용자는 다른 사용자에게 권한을 부여할 수 있는 권한도 갖게 되었음을 의미합니다. 예를 들어:

GRANT ALL PRIVILEGES ON PROCEDURE just_an_example() TO myuser WITH GRANT OPTION;

이 쿼리가 실행된 후 myuser는 원하는 모든 사용자에게 추가 권한을 부여할 수 있으며 처음에는 just_an_example()의 소유자에게만 권한이 부여됩니다.

위에서 설명한 방법에는 사용자에게 직접 모든 권한을 부여하는 방법이 포함됩니다. 그러나 더 나은 방법은 그룹에 모든 권한을 부여하고 사용자를 구성원으로 만드는 것입니다.

이 기술은 여러 사용자를 처리할 때 권한을 구성하거나 권한을 취소하는 데 도움이 되기 때문에 더 좋습니다. 이것이 어떻게 수행되는지 봅시다.

먼저 다음과 같은 방법으로 그룹을 생성합니다.

CREATE GROUP mygroup;

아래 출력과 같이 성공적으로 생성됩니다.

postgresql의 사용자에게 권한 부여 - 출력 3

이제 다음 쿼리를 사용하여 테이블 person에 대한 모든 권한을 mygroup 그룹에 부여합니다.

GRANT ALL PRIVILEGES ON person TO mygroup;

출력은 권한을 성공적으로 부여했음을 보여줍니다.

postgresql에서 사용자에게 권한 부여 - 출력 2

다음으로 다음 구문을 사용하여 myusermygroup의 구성원으로 추가합니다.

GRANT mygroup TO myuser;

멤버십을 확인하는 다음 출력을 제공합니다.

postgresql에서 사용자에게 권한 부여 - 출력 4

이러한 방식으로 person 테이블에 대한 모든 권한을 mygroup 그룹에 부여했으며 myusermygroup의 일부이므로 person에 대한 모든 권한도 가집니다.

PostgreSQL의 사용자에게 데이터베이스 개체에 대한 모든 권한을 부여하는 방법에 대한 논의를 요약합니다. GRANT 키워드의 사용법 및 구문과 사용자에게 모든 권한을 부여하는 데 사용할 수 있는 다양한 방법을 배웠기를 바랍니다.

작가: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub