PostgreSQL : 데이터베이스에 GRANT ALL PRIVILEGES는 무엇을합니까? ALL PRIVILEGES ON DATABASE

주어진 데이터베이스의 모든 테이블에 대한 모든 권한을 새로운 postgres 사용자 (소유자가 아닌)에게 부여하려고합니다. 그렇게 GRANT ALL PRIVILEGES ON DATABASE my_db TO new_user;하지 않는 것 같습니다 . postgres 사용자로 위의 명령을 성공적으로 실행 한 후 new_user로 다음을 얻습니다.

$ psql -d my_db
my_db => SELECT * FROM a_table_in_my_db;
ERROR:  permission denied for relation a_table_in_my_db

두 가지 질문 :

1) 그렇다면 my_db의 모든 테이블에 대한 모든 권한을 부여하지 않으면 위의 명령은 무엇을합니까?

2) 모든 테이블에 대한 모든 권한을 사용자에게 부여하는 올바른 방법은 무엇입니까? (향후 작성된 모든 테이블 포함)



답변

귀하의 질문에 대한 답변은 온라인 PostgreSQL 8.4 문서에서 제공 됩니다.

  1. GRANT ALL PRIVILEGES ON DATABASE보조금 CREATE, CONNECTTEMPORARY역할에 대한 데이터베이스에 대한 권한 (사용자가 제대로라고도 역할 ). 이러한 권한 중 어느 것도 역할이 테이블에서 데이터를 읽도록 허용하지 않습니다. SELECT이를 위해서는 테이블에 대한 권한이 필요합니다.

  2. 모든 테이블에 대한 모든 권한을 역할에 부여하는 “적절한”방법이 있는지 잘 모르겠습니다. 주어진 역할이 테이블에 대한 모든 권한을 갖도록하는 가장 좋은 방법은 역할 이 테이블 을 소유 하는지 확인하는 것 입니다. 기본적으로 새로 작성된 모든 오브젝트는 해당 오브젝트를 작성한 역할이 소유하므로 역할이 테이블에 대한 모든 특권을 갖도록하려면 해당 역할을 사용하여 작성하십시오.

    PostgreSQL 9.0에는 거의 원하는 구문이 다음과 같습니다 .

    GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO new_user;

    문제는 기본 “공용”스키마 외부의 스키마에서 테이블을 작성하면 GRANT적용되지 않는다는 것입니다. 비공개 스키마를 사용하는 경우 GRANT해당 스키마 에 대한 권한을 별도로 부여해야합니다.


답변

데이터베이스 소유자로 작동하기 위해 여러 로그인을 설정할 수 있습니다.

  • 소유자 역할을하는 “nologin”역할을 작성하십시오. create role dbowner nologin
  • 데이터베이스 소유자를 다음과 같이 변경하십시오. alter database mydb owner dbowner
  • 모든 로그인을이 새로운 역할에 부여하십시오. grant dbowner to user1, user2

이제 user1 또는 user2 로그인 인 경우 추가 권한없이 “mydb”에 대한 모든 권한을 갖습니다.

그러나이 솔루션을 신중하게 고려할 것입니다. 스키마가 업데이트 될 때마다 추가 부여를 작성해야하는 번거 로움을 피하기 위해 웹 애플리케이션이 이러한 로그인 중 하나를 사용하도록 유혹하고 있지만이 방법으로 매우 유용한 보호 유형을 제거하고 있습니다. 실제로 여러 “관리자”를 원하지만 “정상 사용”응용 프로그램의 로그인에 대해 “스키마의 모든 테이블에 대한 모든 권한 부여 …”패턴을 사용하는 경우 위의 솔루션을 사용하십시오.


답변