<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.