关系<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 2013年

您以什么用户身份运行初始命令?您从SELECT session_user, current_user脚本顶部得到什么?您的Postgres版本是什么?
Erwin Brandstetter,

如果这些是您运行的确切命令,那么您仍与“主acc”保持连接。因此,降低了拥有的特权。否则,请参见Erwin的出色答案。(让我承认我很愚蠢,此错误消息没有告诉您哪个角色没有权限。例如,当一个人使用SECURITY DEFINER运行一系列功能时,很快就会弄混谁是谁。)
dezso

Answers:


22

DEFAULT PRIVILEGES千万不能更改权限,现有的对象。它们是新创建对象的默认特权,并且仅是它们所属的特定角色的特权。如果您在运行时未定义角色ALTER DEFAULT PRIVILEGES,则默认为当前角色(执行ALTER 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";
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.