복붙노트

[SQL] PostgreSQL의에서 특정 데이터베이스에 대한 권한을 부여

SQL

PostgreSQL의에서 특정 데이터베이스에 대한 권한을 부여

나는 PostgreSQL을 MySQL에서 이동하고있어 사용자 권한으로 벽에 충돌했다. 나는 다음과 같은 명령을 사용하여 데이터베이스의 모든 테이블에 사용자에게 모든 권한을 할당하는 데 사용하고 있습니다 :

# MySQL
grant all privileges on mydatabase.* to 'myuser'@'localhost' identified by 'mypassword';

PostgreSQL의 9.x의 솔루션은 "스키마"에 권한을 할당하는 것을 포함하지만, 내게 필요한 노력이 문제에 SQL 과도한 증명 정확히 파악하는 나에게 나타납니다. 나는 연구의 몇 시간이 답을 얻을 것이라는 점을 알고있다,하지만 난 PostgreSQL을 MySQL에서 모든 사람들의 이동이 간단하고 완벽한 레시피를 제공하는 웹에 적어도 한 페이지 혜택을 얻을 수 있다고 생각. 이것은 내가 사용자를위한 문제에 필요로 한 유일한 명령입니다. 차라리 모든 새로운 테이블에 대해 명령을 실행 할 필요가 없습니다 것입니다.

나는 일반적으로 과거에 핸들에 있었다 그 시나리오의 일부를 나열합니다, 그래서 나는, PostgreSQL을에서 다르게 처리해야 할 어떤 시나리오 모른다. 우리는 이미 생성 된 하나의 데이터베이스에 권한을 수정하는 것을 의미하는 것으로 가정합니다.

나는 모든 데이터베이스에 대한 모든 권한을 부여 답변을 보았다,하지만 내가 여기에 원하는 아니다. 나뿐만 아니라 설명을 상관 없어하지만, 나는, 간단한 조리법을 찾고하시기 바랍니다.

나는 어떤 한 사용자가 손상 될 때 접근 방식은 모든 데이터베이스를 저해 할 수 있으므로으로, 기존의 바로 가기 것으로 보인다, 모든 사용자와 모든 데이터베이스에 대한 권한을 부여하지 않으려 고합니다. 내가 호스트 여러 데이터베이스 클라이언트는 각 클라이언트에게 다른 로그인을 할당합니다.

나는 또한 시리얼 컬럼의 증가 값을 얻을 수있는 USAGE 권한이 필요하지만이 순서의 어떤 종류에 권한을 부여해야 할 것 같습니다. 내 문제는 더 복잡 있어요.

해결법

  1. ==============================

    1.역할은 DB 클러스터의 모든 데이터베이스에 액세스 할 수 있습니다 글로벌 객체 - 필요한 권한 부여.

    역할은 DB 클러스터의 모든 데이터베이스에 액세스 할 수 있습니다 글로벌 객체 - 필요한 권한 부여.

    클러스터는 많은 스키마를 잡아 많은 데이터베이스를 보유하고있다. 다른 데시벨에서 (심지어 같은 이름을 가진) 스키마는 관련이 없습니다. 스키마에 대한 권한을 부여하면은 현재 DB에서이 특정 스키마 (부여시 현재 DB)에 적용됩니다.

    모든 데이터베이스는 기본적으로 스키마 공개로 시작합니다. 즉, 규칙, 그리고 많은 설정이 그것으로 시작합니다. 그 외에는, 스키마 대중은 다른 같은 단지 스키마입니다.

    MySQL의에서 오는, 당신은 효과적으로 완전히 스키마 층을 무시하고 단일 스키마 공개로 시작 할 수 있습니다. 나는 정기적으로 데이터베이스 당 스키마 수십 사용하고 있습니다. 스키마 파일 시스템의 디렉토리 같은 비트 (하지만 완전히)입니다.

    여러 스키마를 사용합니다되면, search_path의 설정을 이해해야합니다 :

    GRANT에 대한 문서 별 :

    이러한 기본값은 모두 ALTER의 DEFAULT 권한으로 변경할 수 있습니다 :

    @Craig 댓글을 달았 마찬가지로 그룹의 역할에 부여 된 권한에 최선을 그리고 그 역할의 특정 사용자 구성원 (사용자 역할에 대한 GRANT 그룹 역할을) 확인하십시오. 이 방법은 아웃 처리 및 특정 작업에 필요한 권한의 번들을 취소 간단하다.

    그룹의 역할은 로그인없이 또 다른 역할이다. 사용자 역할로 변환하기 위해 로그인을 추가합니다. 더:

    말은, 우리는 새로운 mydb 데이터베이스, 그룹 mygrp, 및 사용자 myusr이 ...

    수퍼 유저로 문제의 데이터베이스에 연결하는 동안 (예를 들어 포스트 그레스) :

    REVOKE ALL ON DATABASE mydb FROM public;  -- shut out the general public
    GRANT CONNECT ON DATABASE mydb TO mygrp;  -- since we revoked from public
    
    GRANT USAGE ON SCHEMA public TO mygrp;
    

    당신이 (내가 더 제한 될 수 있음) 쓴 것처럼 모든 테이블에 사용자에게 모든 권한을 할당하려면 :

    GRANT ALL ON ALL TABLES IN SCHEMA public TO mygrp;
    GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO mygrp; -- don't forget those
    

    이 스키마에서 오브젝트를 작성합니다 모든 역할에 대한 실행 미래의 객체에 대한 기본값 설정 권한,받는 사람 :

    ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
    GRANT ALL ON TABLES TO mygrp;
    
    ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
    GRANT ALL ON SEQUENCES TO mygrp;
    
    -- more roles?
    

    이제 사용자에게 그룹에 부여 :

    GRANT mygrp TO myusr;
    

    관련 대답 :

    MySQL의에서 오는, 당신은 분리 된 데이터베이스에 대한 권한을 유지하려는 때문에,이 표준이 아닌 설정 db_user_namespace을 좋아 있습니다. 문서 별 :

    설명서를주의 깊게 읽어보십시오. 나는이 설정을 사용하지 마십시오. 그것은 위를 무효화하지 않습니다.

  2. ==============================

    2.당신이 더 밀접하게 MySQL의에서 데이터베이스를 호출하면 PostgreSQL 데이터베이스보다 PostgreSQL의 스키마를 닮았다.

    당신이 더 밀접하게 MySQL의에서 데이터베이스를 호출하면 PostgreSQL 데이터베이스보다 PostgreSQL의 스키마를 닮았다.

    연결 슈퍼 유저로 데이터베이스 "테스트"로 설정합니다. 다음의 그

    $ psql -U postgres test
    

    기존 사용자 "테스터"에 대한 기본 권한을 변경합니다.

    ALTER DEFAULT PRIVILEGES IN SCHEMA public
        GRANT INSERT, SELECT, UPDATE, DELETE ON TABLES
        TO tester;
    

    기본 권한을 변경하면 기존 테이블에 영향을주지 않습니다. 즉 디자인입니다. 기존 테이블의 경우, 표준 GRANT 및 REVOKE 구문을 사용합니다.

    당신은 사용자에 대한 할당 권한이 존재하지 않습니다 수 없습니다.

  3. ==============================

    3.확인. 올바른 역할에 테이블을 할당 할 때 부여 된 권한은 모든 사용자 역할 별이 아닌 것이다! 그럼 당신에게 역할을주고 사람을 결정할 수 있습니다.

    확인. 올바른 역할에 테이블을 할당 할 때 부여 된 권한은 모든 사용자 역할 별이 아닌 것이다! 그럼 당신에게 역할을주고 사람을 결정할 수 있습니다.

    확인. 나중에 테이블을 만들 수 있습니다. 올바른 클라이언트 역할을 준비 할당 테이블이있는 경우.

    CREATE TABLE tablename();
    CREATE ROLE rolename;
    ALTER TABLE tablename OWNER TO rolename;
    

    확인. 당신이 준비가되면 사용자 이름을 만듭니다. 클라이언트가 둘 이상의 사용자 이름을 필요로하는 경우 단순히 두 번째 클라이언트 사용자 이름을 만들 수 있습니다.

    CREATE USER username1;
    CREATE USER username2;
    

    확인. 당신이 권한을 부여 할 준비가되면, 사용자를 만들고 그녀에게 올바른 역할을 할당합니다. 사용자에게 할당 역할에 사용 GRANT-TO 명령.

    GRANT rolename TO username1;
    GRANT rolename TO username2;
    

    확인. 당신은 사용자에게 권한을 추가하려면 다음 명령을 실행합니다.

    GRANT SELECT, UPDATE, INSERT, DELETE ON dbname TO role-or-user-name;
    ALTER USER username1 CREATEDB;
    
  4. ==============================

    4.만 PUBLIC를 사용하는 경우 스키마에 대해 잊을 수 있습니다. (여기 문서를 참조) 그럼 당신은 같은 것을 할

    만 PUBLIC를 사용하는 경우 스키마에 대해 잊을 수 있습니다. (여기 문서를 참조) 그럼 당신은 같은 것을 할

    GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
        [, ...] | ALL [ PRIVILEGES ] }
        ON { [ TABLE ] table_name [, ...]
             | ALL TABLES IN SCHEMA schema_name [, ...] }
        TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
    
  5. from https://stackoverflow.com/questions/24918367/grant-privileges-for-a-particular-database-in-postgresql by cc-by-sa and MIT license