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.