<table> 관계에 대한 권한이 거부되었습니다.


12

psql에서 다음 SQL을 실행했습니다.

CREATE USER bspu LOGIN;

CREATE DATABASE bsp OWNER bspu;

GRANT ALL PRIVILEGES ON DATABASE bsp TO bspu;

\c bsp

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  client_id VARCHAR(20) NOT NULL,
  api_key VARCHAR(100) NOT NULL,
  api_secret VARCHAR(100) NOT NULL,
  auth_token VARCHAR(128) NOT NULL
);

로 로그인 bspu하고 users테이블 을 쿼리하려고 하면 오류가 발생합니다.

permission denied for relation users

나는 달리기를 시도했다.

ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO bspu;

그러나 도움이되지 않습니다. 내가 무엇을 잘못하고 있지? 데이터베이스 소유자가 자체 데이터베이스를 쿼리 할 권한이없는 이유는 무엇입니까?

편집 : 나는 bspu지금 수퍼 유저로 업그레이드 했으므로 작업을 계속할 수 있습니다. 더 이상의 지침에 감사드립니다.


\dt "users"show 의 출력은 무엇입니까 ?
bma

@bma 내 주요 계정 만 표시됩니다.
__name__이 None 인 경우

어떤 사용자로 초기 명령을 실행 했습니까? SELECT session_user, current_user스크립트 상단 에서 무엇을 얻 습니까? 그리고 Postgres 버전은 무엇입니까?
Erwin Brandstetter

이것이 당신이 실행 한 정확한 명령이라면, 여전히 'main acc'와 연결되어 있습니다. 그래서 당신 이 가진 특권이 내려갑니다 . 그렇지 않으면 Erwin의 훌륭한 답변을 참조하십시오. (이 오류 메시지가 어떤 역할에 권한이 없는지 알려주지 않는다는 것이 멍청하다고 인정합니다. 예를 들어, SECURITY DEFINER를 사용하여 일련의 기능을 실행하면 누가 누구인지 혼란스럽게
만듭니다

답변:


22

DEFAULT PRIVILEGES기존 개체에 대한 권한을 변경 하지 마십시오 . 새로 생성 된 개체와 해당 개체가 속한 특정 역할에 대해서만 기본 권한입니다. 실행할 때 역할을 정의하지 않으면 명령문을 실행할 때 기본적으로 현재 역할이 사용됩니다 .ALTER DEFAULT PRIVILEGESALTER DEFAULT PRIVILEGES

또한 serial을 생성 하는 열을 사용하고 있으므로 SEQUENCE시퀀스에 대한 기본 권한도 설정해야합니다.

명령 을 실행 하기 전에 오브젝트를 작성하는 사용자에서이를 실행하십시오 CREATE.

ALTER DEFAULT PRIVILEGES [ FOR ROLE my_create_role] GRANT ALL ON TABLES TO bspu;
ALTER DEFAULT PRIVILEGES [ FOR ROLE my_create_role] GRANT ALL ON SEQUENCES TO bspu;

pgAdmin을 사용해야하는 경우주의해야합니다. 에 대한 리버스 엔지니어링 된 SQL 스크립트를 표시 할 때 현재 버전 1.20 이상에 버그가 있습니다 DEFAULT PRIVILEGES. 디스플레이는 소유 사용자를 무시하므로 특정 상황에서는 올바르지 않습니다. 버그를보고했습니다 . 문제가 보류 중 입니다.

를 들어 기존의 객체 당신은 또한이 "배치"형태에 관심이있을 수 있습니다 GRANT명령 :

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO bspu;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO bspu;

SO에 대한이 관련 질문에 대한 자세한 내용 :


1
버그 참조 pgAdmin4에서 계속 발생 언급 redmine.postgresql.org/issues/4685 의 중복으로 표시했습니다, redmine.postgresql.org/issues/4256
dpprdan

-1
This is working for me after some research. psql (9.6.12)

-- login to postgres database server as postgres user.
ssh <user>>@hostname.<domain>>.com
sudo su postgres
id
psql
postgres=# create user sentry_read with login password 'sentry_read';
postgres=# du+
postgres=# \l+
-- **very important: make sure we should connect required database before we grant to user.**
postgres=# \c sentry
postgres=# \dt
sentry=# \dp SENTRY_VERSION
sentry=# select * from "SENTRY_VERSION";
sentry=# GRANT SELECT ON ALL TABLES IN SCHEMA public TO sentry_read;
postgres=# \q

[user@hostname ~]$ psql -U sentry_read -d sentry -h hostname.<domain>>.com -W
sentry=> select * from "SENTRY_VERSION";
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.