psql을 사용하여 데이터베이스 권한을 나열하십시오.


142

데이터베이스 서버 마이그레이션 중이며 psql명령 줄 도구를 사용하여 PostgreSQL에서 데이터베이스 권한 (또는 서버 전체의 모든 권한)을 어떻게 나열 할 수 있습니까?

우분투 11.04에 있으며 PostgreSQL 버전은 8.2.x입니다.

답변:


116
postgres=> \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres

에 문서가GRANT 출력을 해석하는 방법에 대한 설명을 제공합니다. 현재 데이터베이스의 테이블에 대한 특정 권한을 사용하려면을 사용하십시오 \z myTable.


5
\z myTable"지금은 작동합니까? 그렇지 않습니다 ??? " 라고 말할 때 누군가에게 액세스 권한을 부여하고 바보처럼 보이지 않도록하기에
— 완벽합니다.

107

아마도 당신은 데이터베이스에 대한 사용자와 그들의 권한을 나열하는 것을 의미합니다.

postgres=> \du
                             List of roles
    Role name    |  Attributes  |                    Member of
-----------------+--------------+------------------------------------------------
 dba             | Create role  | {util_user,helpdesk_user,helpdesk_admin}
 helpdesk_admin  | Cannot login | {helpdesk_user}
 helpdesk_user   | Cannot login | {helpdesk_reader}
 jack            |              | {helpdesk_admin}
 postgres        | Superuser    | {}
                 : Create role
                 : Create DB

아니요, 특정 데이터베이스의 권한을 나열하는 방법을 원했지만 이미 파악했습니다. 데이터베이스 소유자는 항상 모든 권한을 갖습니다. 그런 다음 데이터베이스에 대한 다른 권한을 다른 사용자 / 그룹에 추가 할 수 있습니다. 이들은 \ l 명령과 함께 나열됩니다. 그러나 어쨌든 매우 감사합니다.
— pedrosanta

80

다음과 같이하면됩니다 :

SELECT grantee, privilege_type 
FROM information_schema.role_table_grants 
WHERE table_name='mytable'

이것은 당신에게 이런 종류의 출력을 제공합니다 :

mail=# select grantee, privilege_type from information_schema.role_table_grants where table_name='aliases';
   grantee    |  privilege_type
--------------+-----------------
 mailreader   |  INSERT
 mailreader   |  SELECT
 mailreader   |  UPDATE
 mailreader   |  DELETE
 mailreader   |  TRUNCATE
 mailreader   |  REFERENCES
 mailreader   |  TRIGGER
(7 rows)

mail=#

10
사이트에 오신 것을 환영합니다! 하나의 작은 질문 : 왜 출력을 스크린 샷으로 삽입 했습니까? 가능한 한 일반 텍스트를 사용하십시오.
— dezso


1
시퀀스에 대한 권한을 볼 수있는 방법이 있습니까? 이것은 테이블 정보 만 제공합니다
— 호기심 많은

(Postgres 9.4에서) 위의 내용은 구체화 된 뷰에서 작동하지 않습니다.
— SeldomNeedy

@mailmaner 역할을 사용하여 새 역할 'new_role'을 추가하면 information_schema.role_table_grants도 new_role을 나열합니까?
— Anand

15

사용 psql메타 명령을 :

https://www.postgresql.org/docs/current/static/app-psql.html

Ctrl + F를 사용하여 페이지를 살펴보면 다음이 제공됩니다.

\ddp [ pattern ] 기본 액세스 권한 설정을 나열합니다.

\dp [ pattern ] 관련 액세스 권한이있는 테이블, 뷰 및 시퀀스를 나열합니다.

\l[+] [ pattern ] 서버의 데이터베이스를 나열하고 .... 액세스 권한을 표시하십시오.

또한 위에서 언급했지만 매뉴얼 페이지에서 "권한"이라는 단어가 없습니다.

\du+로그인 \dg+이있는 역할 및 없는 역할의 경우- "Member of"역할에 부여 된 역할을 찾을 수있는 위치에 보관됩니다.

나는 psql간신히 조작 된대로 매뉴얼 에서 찾은 기능 및 언어 권한을 의도적으로 건너 뜁니다 (이러한 권한을 사용하면 조언을 위해 여기에 오지 않습니다). 메타 명령 뒤에 "+"를 사용하면 사용자 정의 유형, 도메인 등이 동일하게 적용됩니다 (해당되는 경우).


권한을 확인하는 약간의 극단적 인 방법은 트랜잭션에서 사용자를 삭제하는 것입니다. 예 :

s=# begin; drop user x;
BEGIN
Time: 0.124 ms
ERROR:  role "x" cannot be dropped because some objects depend on it
DETAIL:  privileges for type "SO dT"
privileges for sequence so
privileges for schema bin
privileges for table xx
privileges for table "csTest"
privileges for table tmp_x
privileges for table s1
privileges for table test
Time: 0.211 ms
s=# rollback;
ROLLBACK
Time: 0.150 ms

목록이 N보다 길면 (적어도 9.3에서) 권한 목록이있는 경고가 축소되지만 여전히 로그에서 전체를 찾을 수 있습니다 ...


12

Undercovers psql은 \du명령 을 실행할 때 다음 쿼리를 사용합니다 .

SELECT r.rolname, r.rolsuper, r.rolinherit,
  r.rolcreaterole, r.rolcreatedb, r.rolcanlogin,
  r.rolconnlimit, r.rolvaliduntil,
  ARRAY(SELECT b.rolname
        FROM pg_catalog.pg_auth_members m
        JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)
        WHERE m.member = r.oid) as memberof
, r.rolreplication
, r.rolbypassrls
FROM pg_catalog.pg_roles r
WHERE r.rolname !~ '^pg_'
ORDER BY 1;

이 SQL 표준입니까?
— ribamar

` "오류 : r.rolbypassrls 열이 존재하지 않습니다 \ n \ nLINE 9 :, r.rolbypassrls \ n \ n ^ \ n", 불행히도 작동하지 않습니다
— ribamar

10

(아마도 명백한) 추가 단계는 postgres 사용자가됩니다. 그렇지 않으면 존재하지 않는 역할에 대한 오류가 발생할 수 있습니다.

sudo su - postgres
psql -l

또는

psql
postgres=> \l

2
메타 : 나는이 질문이 구글 쿼리 "postgres list role"에 대해 높은 평가를 받았기 때문에 이것을 추가하고 있으며 원하는 것을 찾기 전에 훨씬 낮은 순위의 결과에 약간의 시간을 보냈으므로 여분의 정보를 기념하고 있습니다.
— Adam Shostack

-1
-- file: src/sql/pgsql/list-table-priviledges.sql
-- usage:
-- alias psql="PGPASSWORD=${postgres_db_useradmin_pw:-} psql -v -q -t -X -w -U ${postgres_db_useradmin:-}"
-- psql -d dev_qto < src/sql/pgsql/list-table-priviledges.sql | less
SELECT grantee, table_name , privilege_type
FROM information_schema.role_table_grants
WHERE 1=1
AND grantee = 'usrqtoapp'
AND table_name='readme_doc'
;

-- purpose:
-- list the priveledges per user or for user in a database
-- eof file: src/sql/pgsql/list-table-priviledges.sql

산출

usrqtoapp | readme_doc | INSERT
usrqtoapp | readme_doc | SELECT
usrqtoapp | readme_doc | UPDATE
usrqtoapp | readme_doc | DELETE
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.