我在 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
);
Run Code Online (Sandbox Code Playgroud)
当我以 身份登录bspu
并尝试查询users
表时,出现错误:
Run Code Online (Sandbox Code Playgroud)permission denied for relation users
我尝试运行:
ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO bspu;
Run Code Online (Sandbox Code Playgroud)
但它没有帮助。我究竟做错了什么?为什么数据库所有者没有权限查询自己的数据库?
编辑:我bspu
现在升级为超级用户,所以我可以继续工作。任何进一步的指导表示赞赏。
我有一个 PostgreSQL (9.4) 数据库,它根据当前用户限制对记录的访问,并跟踪用户所做的更改。这是通过视图和触发器实现的,并且在大多数情况下效果很好,但是我在需要INSTEAD OF
触发器的视图上遇到了问题。我试图减少问题,但我提前道歉,这仍然很长。
到数据库的所有连接都是通过单个帐户从 Web 前端建立的dbweb
。连接后,角色将通过SET ROLE
Web 界面更改为对应的人,所有此类角色都属于组角色dbuser
。(有关详细信息,请参阅此答案)。让我们假设用户是alice
。
我的大部分表都放置在一个架构中,在这里我将调用该架构private
并属于dbowner
. 这些表不能直接dbuser
被其他角色访问,但可以被其他角色访问dbview
。例如:
SET SESSION AUTHORIZATION dbowner;
CREATE TABLE private.incident
(
incident_id serial PRIMARY KEY,
incident_name character varying NOT NULL,
incident_owner character varying NOT NULL
);
GRANT ALL ON TABLE private.incident TO dbview;
Run Code Online (Sandbox Code Playgroud)
特定行对当前用户的可用性alice
由其他视图确定。一个简化的例子(可以减少,但需要以这种方式来支持更一般的情况)是:
-- Simplified case, but in principle could join multiple tables to determine allowed ids …
Run Code Online (Sandbox Code Playgroud)