我将用户添加myuser到 Postgres。
然后我mydatabase在 pgAdmin III GUI 中添加了数据库并从备份文件中恢复。所以拥有者mydatabase是超级用户postgres。
然后我试图给所有的访问权和修改mydatabase来myuser。我psql以用户身份登录postgres:
psql -d template1 -U postgres
Run Code Online (Sandbox Code Playgroud)
然后我运行了这个查询:
GRANT ALL PRIVILEGES ON DATABASE mydatabase TO myuser
Run Code Online (Sandbox Code Playgroud)
现在我可以myuser用来记录,但如果我尝试一个简单的查询,我会得到这个错误:
Run Code Online (Sandbox Code Playgroud)ERROR: permission denied for relation table_name
我错过了什么吗?你能帮我解决吗?
我在 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现在升级为超级用户,所以我可以继续工作。任何进一步的指导表示赞赏。
我最近想与服务器的一个用户共享定期访问权限和我认识到,一个简单的CREATE USER和GRANT ALL ON DATABASE命令没有让他运行一个简单SELECT的数据。
我想将给定数据库中所有表的权限授予指定用户,但我不确定授予他对整个架构的访问权限是否是最好的主意,public因为我不知道这是否允许某种特权升级。有没有其他办法?
我正在尝试为SELECTRedshift 中的组分配权限。所以我在该组中创建了一个组和一个用户:
CREATE GROUP data_viewers;
CREATE USER <user> PASSWORD '<password>' IN GROUP data_viewers;
Run Code Online (Sandbox Code Playgroud)
现在我想让这个组能够从任何表中读取数据:
GRANT SELECT ON ALL TABLES IN SCHEMA PUBLIC TO GROUP data_viewers;
Run Code Online (Sandbox Code Playgroud)
命令返回GRANT。现在,当我以新创建的用户身份连接到 Redshift 并发出问题时,SELECT * FROM something.something;我得到:
架构某物的权限被拒绝
我尝试授予某些东西的权限:GRANT SELECT ON ALL TABLES IN SCHEMA something TO GROUP data_viewers;但这并没有改变任何东西。
如何允许我组中的用户SELECT访问架构中任何表中的数据?
在 PostgreSQL 8.4 中执行触发器函数需要什么权限?
似乎为角色设置的权限与执行触发器功能无关。我想我有一天看到执行触发器函数所需的特权是 EXECUTE 特权,但对于表的所有者,而不是执行触发调用触发器函数的触发器的操作的实际角色。
我找不到解释这一点的文档部分,有什么帮助吗?
postgresql trigger stored-procedures permissions postgresql-8.4
ALTER DEFAULT PRIVILEGES
FOR ROLE engineering
IN SCHEMA reference
GRANT SELECT ON TABLES to analytics;
Run Code Online (Sandbox Code Playgroud)
该语法运行并具有有效含义。它的实现方式是,每当engineering 角色创建一个表(在reference模式中)时,该角色的任何成员都reporting将自动拥有对该表的读取访问权限。但要使其发挥作用,您必须在创建表时以角色身份登录或模拟(set session authorization等set role) 。engineering
我理解postgres 实现这一点的方式背后的基本原理。他们希望每个角色/用户设置自己的默认值。默认值是一种方便的简写,因此用户不必为他们创建的每个表设置权限。Postgres 甚至允许某人为他们可以模拟的任何角色设置默认值(因此超级用户可以为每个人设置默认值)。这非常强大,但是 postgres 不想让它变得太强大。他们仍然希望人们必须为每个用户的默认值发出单独的命令。他们希望人们认真思考他们为他们提供这种便利的每一位用户。
但是,我已经认真考虑过,我确实想为整个团队提供这些便利。我想要一个命令,让工程团队中的每个用户都继承这些默认权限。然后,每次他们中的一个创建一个表时,每个报告成员都会自动读取该表。事实上,当我第一次发现可以包含该子句时,这就是我解释语法的方式FOR ROLE engineering。但默认值不会被继承。
或者,我也对一个解决方案感兴趣,无论谁(无论他们位于哪个团队)在模式中创建一个表reference,该角色的所有成员都可以读取该表reporting。reporting因此,在这种变体中,即使我无法(直接)控制谁授予这些权限(以及为什么我想要这样做?),我仍然可以打开架构。如果我有这个解决方案,我仍然可以有效地将其限制为engineering团队成员(如果他们是架构中唯一具有创建权限的人)reference。
我是否遗漏了某些内容(例如替代语法)?或者还有其他解决方法吗?
我对任何解决方案(甚至构建自定义扩展)持开放态度,只要它不属于以下两个类别之一:
即每次团队成员engineering登录或创建表时,他们都必须执行一些额外的命令来处理权限(例如在启动会话时更改工程角色)
我按照以下步骤操作。
postgres通过 ( sudo -i -u postgres)登录的new_user通过 shell 脚本创建了新用户createuser --interactivecreatedb new_db.现在我想授予new_user权限,能够对他自己创建的表执行所有默认的 DML 操作(下面的命令取自这个问题),所以我输入:
postgres=# ALTER DEFAULT PRIVILEGES FOR new_user IN SCHEMA
public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO new_user;
Run Code Online (Sandbox Code Playgroud)
但是得到了一个错误:
ERROR: syntax error at or near "new_user"
LINE 1: ALTER DEFAULT PRIVILEGES FOR new_user IN SCHEMA public GRANT...
Run Code Online (Sandbox Code Playgroud)
我不知道为什么这个命令不起作用。
我有一个名为 Blackacre 的数据库和两个可以访问它的角色:johnrole和janerole。janerole已被授予ALL特权,而johnrole仅被授予SELECT特权。
问题是当来自janerole的用户创建一个新表时,来自johnrole的用户不能SELECT从新表中创建。
Run Code Online (Sandbox Code Playgroud)ERROR: permission denied for relation mopery
我尝试以ALTER DEFAULT不同的方式使用来自动化:
ALTER DEFAULT PRIVILEGES FOR ROLE johnrole IN SCHEMA public
GRANT SELECT ON TABLES TO johnrole;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO johnrole;
ALTER DEFAULT PRIVILEGES FOR ROLE johnrole GRANT SELECT ON TABLES TO PUBLIC;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON …Run Code Online (Sandbox Code Playgroud) 这是我建议的架构:
CREATE TABLE Surveys (
id serial primary key,
user_email citext,
survey_data jsonb,
created_at timestamp default current_timestamp
);
CREATE INDEX surveys_email_idx ON Surveys(user_email);
CREATE USER SurveyWriter;
Run Code Online (Sandbox Code Playgroud)
我知道我需要:
GRANT INSERT ON dbname.Surveys TO SurveyWriter;
Run Code Online (Sandbox Code Playgroud)
但我还需要:
GRANT INSERT, UPDATE ON dbname.surveys_email_idx to SurveyWriter;
Run Code Online (Sandbox Code Playgroud)
还有什么我没有想到的吗?
我正在创建一个 pre-prod Postgres 数据库,并希望确保访问用户具有有限的访问权限。
我想以这样的方式设置表的访问用户不能CREATE,DROP或ALTER对象。目前,我可以看到将所有权更改为另一个用户的唯一方法,例如postgres然后以某种方式仅授予所需的权限:
ALTER TABLE mytable SET OWNER TO postgres;
REVOKE connect ON DATABASE mydatabase FROM PUBLIC;
GRANT USAGE, SELECT, UPDATE ON ALL TABLES IN SCHEMA public TO dbuser;
GRANT connect ON DATABASE mydatabase TO dbuser;
Run Code Online (Sandbox Code Playgroud)
问题是当我执行上述操作SELECT时,当我与应用了授权的用户连接时,我无法做一个简单的事情。例如:
select * from mytable;
Run Code Online (Sandbox Code Playgroud)
产量:
Run Code Online (Sandbox Code Playgroud)ERROR: permission denied for relation mytable
如何做到这一点?
此外,我应该使用public?以外的命名模式吗?
我想创建一个“不可变”的Postgres数据库,用户只能insert/ select(写入/读取)数据,但不能update/ delete(更改/删除)。
我知道有FOR UPDATE锁,但不知道如何使用它。
假设我有下表,如何使其不可变(或者,如果我理解正确,如何FOR UPDATE永久使用锁)?
CREATE TABLE account(
user_id serial PRIMARY KEY,
username VARCHAR (50) UNIQUE NOT NULL,
password VARCHAR (50) NOT NULL,
email VARCHAR (355) UNIQUE NOT NULL,
created_on TIMESTAMP NOT NULL,
last_login TIMESTAMP
);
Run Code Online (Sandbox Code Playgroud)