関係<テーブル>の許可が拒否されました


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
);

としてログインしbspuusersテーブルをクエリしようとすると、エラーが発生します。

permission denied for relation users

私は走ってみました:

ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO bspu;

しかし、それは役に立ちません。何が悪いのですか?データベース所有者が自分のデータベースをクエリする権限を持っていないのはなぜですか?

編集:私bspuは今のところスーパーユーザーにアップグレードしたので、作業を続けることができます。それ以上のガイダンスはありがたいです。


\dt "users"表示の出力は何ですか?
bma 2013年

@bma私のメインのアカウントのみがリストされています。
__name__がNoneの場合

最初のコマンドはどのユーザーとして実行しましたか?SELECT session_user, current_userスクリプトの上部から何を取得しますか?そして、あなたのPostgresバージョンは何ですか?
Erwin Brandstetter 2013年

これらがあなたが実行した正確なコマンドであった場合、あなたはまだあなたの「メインアカウント」に接続されています。したがって、どのような特権持っているかがわかります。そうでなければ、アーウィンの優れた答えを見てください。(このエラーメッセージでは、どのロールに権限がないかが分からないので、私は馬鹿げていると思います。たとえば、SECURITY DEFINERを使用して関数のチェーンを実行すると、だれが誰であるかがかなり速く混乱します。)
dezso

回答:


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
4256の

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