postgresql의 모든 테이블에 GRANT SELECT


답변:


144

9.0 이후 postgres는 스키마의 모든 테이블 (및 다른 객체)에 대한 권한을 부여하는 구문을 가지고 있다고 언급하는 것이 도움이 될 수 있다고 생각했습니다.

GRANT SELECT ON ALL TABLES IN SCHEMA public TO user;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO user;

여기 링크가 있습니다.


곧 업그레이드 할 예정입니다. 정말 좋은 소식입니다. 감사!
Adam Matan 2016 년

이것은 공개 스키마를 사용하는 서버의 모든 데이터베이스에 영향을 줍니까?
kristianp

5
새 테이블을 만들면이 사용자가 새로 만든 테이블에 액세스 할 수 있습니까?
GuiSim

8
@GuiSim 아니요, default privilegesytou에서 테이블을 생성하는 스키마 를 설정 해야합니다. postgresql.org/docs/current/static/…
SkyRaT

@kristianp 아니요, PG 클러스터의 모든 데이터베이스에는 고유 한 공개 스키마가 있습니다. public연결된 현재 DB 에 대한 스키마의 모든 테이블 (함수)에 영향을줍니다 .
SkyRaT

11

내 (비 라이너) 솔루션 :

#!/bin/bash

for table in `echo "SELECT schemaname || '.' || relname FROM pg_stat_user_tables;" | psql -A -t my_database_name`;
do
    echo "GRANT SELECT ON TABLE $table to my_new_user;"
    echo "GRANT SELECT ON TABLE $table to my_new_user;" | psql my_database_name
done

특권 사용자로부터 실행, 그것은 매력처럼 작동했습니다.


3
all_tables 대신 pg_stat_user_tables를 사용하는 경우 grep이 필요하지 않습니다 ... 또한 형식화 된 출력을 제거하려면 -A -t를 psql에 전달하십시오.
Magnus Hagander

1
Postgres 9.0 부터이 답변의 접근 방식은 어려운 방법입니다. 9.x에서는 이제이 다른 답변 에 "모두 ON"이 표시됩니다 .
Basil Bourque

테이블 또는 스키마 이름에 대문자가 포함되어 있으면 작동하지 않습니다. 아래에 수정 된 버전 추가
Anneb

9

이는 2 단계 프로세스로 수행 할 수 있습니다.

  1. 이 쿼리를 실행하십시오.

    select 'grant all on '||schemaname||'.'||tablename||' to $foo;'
    from pg_tables where schemaname in ('$bar', '$baz')
    order by schemaname, tablename;
    

    교체 :

    $foo= 권한을 부여하려는 사용자 이름
    $bar, $baz= 권한을 부여하려는 스키마 ( "공개"일 수 있음)

  2. 필요한 권한을 생성하는 쿼리 목록이 표시됩니다. 출력을 복사하여 다른 쿼리에 붙여 넣고 실행하십시오.


2

이것이 내가 사용한 것입니다 :

psql dbname -tc "select 'grant select on '||relname||' to readonly;' from pg_stat_user_tables" | psql dbname

SQL에서 서식 지정 및 where-clauses를 수행하는 것이 더 자연 스럽다고 생각합니다.


2

나는 일을 결국 , 그리고 일 :

ALTER DEFAULT PRIVILEGES IN SCHEMA public 
GRANT SELECT ON TABLES TO PUBLIC;

1

postgres 8.4로 작업하고 있으며 사용자에게 모든 권한을 부여하려면 다음을 수행하십시오.

#!/bin/bash

for table in `echo "SELECT schemaname||'.'||relname FROM pg_stat_all_tables WHERE schemaname NOT IN('pg_catalog','pg_toast','information_schema')" | psql -t db `;
do
    echo "grant select on table $table to my_new_user;"
    echo "grant select on table $table to my_new_user;" | psql db
done

1
영어로 부탁드립니다.
Linger

0

이를 해결하는 한 가지 방법은 저장 프로 시저를 작성하는 것입니다. 불행히도 "모든 테이블에 모든 것을 부여"명령은 없습니다. 이 작업을 수행하려면 프로 시저 또는 외부 쉘 스크립트가 필요합니다.


0

Adam Matan의 (한 줄짜리 솔루션) 스크립트는 스키마가 많을 때 유용하지만 스키마 이름이나 테이블 이름에 대문자 나 특수 문자가있는 경우 작동하지 않습니다.

수정 된 버전 :

#!/bin/bash

for table in `echo "SELECT '\"' || schemaname || '\".\"' || relname || '\"'  FROM pg_stat_user_tables;" | psql -A -t my_database_name`;
do
    echo "GRANT SELECT ON TABLE $table to my_new_user;"
    echo "GRANT SELECT ON TABLE $table to my_new_user;" | psql my_database_name
done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.