我将用户添加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
我错过了什么吗?你能帮我解决吗?
我目前正在学习 PostgreSQL 和 MySQL 之间的差异,因为我有一个新项目,而且我还打算将我现有的软件从 MySQL 迁移到 PostgreSQL。我实际上已经开始创建一个 HTML 表,比较两者之间的命令(用于用户/数据库/命令提示符等)。在阅读了这里的答案后,我注意到它role似乎被用作一个组。与MySQL我有两个用户,基本公共(DELETE,INSERT,SELECT和UPDATE权限),并与一对夫妇的额外权限的管理员用户。
所以基本上在 Windows 7 命令提示符下(仅限本地开发)...
GRANT或REVOKE获得用户权限时,角色与用户相比如何(如果有的话)?[我认为这个问题的根本原因是我不了解权限和特权......]
所以,为了设置舞台,我的设置是一个数据库,称之为MyDb。
我有两个用户,spu1和u1,spu1是超级用户,u1是“普通”用户。MyDb的所有者是spu1。我想我还应该说u1具有从组角色继承的创建数据库和创建角色权限。
我有一个架构sch1,它是一个用户定义的架构。
在这个模式中,我有一个表,称为tbl1,还有一个物化视图,称为mvw1。
该TBL1的主人是SPU1,该mvw1的主人是U1。
在当前设置中,如上所述,我无法将mvw1刷新为u1或spu1。我只是得到以下有趣的错误(我已经广泛搜索了它,但没有找到任何可以完全解决我的设置的错误......)。
ERROR: permission denied for relation tbl1
********** Error **********
ERROR: permission denied for relation tbl1
SQL state: 42501
Run Code Online (Sandbox Code Playgroud)
我发现
我试图找出我需要授予普通用户u1缺少的权限(理想情况下所需的最低权限),以便我可以在以他们的身份登录时刷新此视图。
第一个选项虽然很高兴知道,但并不能解决我的问题。第二个选项似乎实际上是在向非超级用户授予超级用户权限,或者授予比我需要的更大的权限。
如果有人可以向我解释这里到底发生了什么(或指出我在解决问题所需的描述中遗漏了哪些信息),并让我知道我的第二个选择是否真的可行或更好的选择? …
postgresql permissions materialized-view errors postgresql-9.3
我正在尝试对 RDS 实例上的 PostgreSQL 数据库进行我认为常见的设置。我希望有:
public架构上,还是在自定义架构上,我都不太关心GRANT我已尝试以下操作但无济于事,postgres用户是由 RDS 创建的具有角色的用户rds_superuser:
-- Making sure roles can't do anything on the database without explicit grant
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
REVOKE ALL ON DATABASE my_database FROM PUBLIC;
CREATE SCHEMA my_schema;
-- Read-write
CREATE ROLE read_write;
GRANT CONNECT ON DATABASE my_database TO read_write;
GRANT USAGE, CREATE ON SCHEMA my_schema TO read_write;
GRANT SELECT, INSERT, UPDATE, …Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的脚本来创建一个新数据库并创建一个新用户来访问这个数据库。这是由默认的 postgres 用户运行的。授予用户对数据库和模式的访问权限后,新创建的用户仍然无法看到\dtpsql 中使用的表。以下是脚本的一些片段,以显示我迄今为止尝试过的内容:
CREATE USER api WITH ENCRYPTED PASSWORD 'password';
ALTER DEFAULT PRIVILEGES
FOR USER api
IN SCHEMA public
GRANT ALL ON ALL TABLES TO api;
DROP DATABASE IF EXISTS new_db;
CREATE DATABASE new_db;
CREATE TABLE addresses (
address_id INTEGER,
address_line_1 VARCHAR(50) NOT NULL,
address_line_2 VARCHAR(50),
city VARCHAR(50) NOT NULL,
state VARCHAR(2) NOT NULL,
zipcode VARCHAR(12) NOT NULL,
PRIMARY KEY (address_id)
);
-- Create more tables....
-- Added these in for good measure at the end:
GRANT …Run Code Online (Sandbox Code Playgroud) 我按照以下步骤操作。
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)
我不知道为什么这个命令不起作用。
我想要
GRANT SELECT
ON ALL TABLES
TO foo;
Run Code Online (Sandbox Code Playgroud)
但是 postgres 告诉我“TO”有一个语法错误。它期望像这样的 GRANT:
GRANT SELECT
ON ALL TABLES
IN SCHEMA public
TO foo;
Run Code Online (Sandbox Code Playgroud)
我们已经碎片化,使得表了一把public,shard123和shard124一切有一个表my_table,并public.my_table为双方的父母shard123.my_table和shard124.my_table。对于公共模式,我已将 SELECT 授予 foo,但 foo 没有任何分片模式的权限。
我也做过:
ALTER DEFAULT PRIVILEGES
FOR ROLE dba
GRANT SELECT
ON TABLES
TO foo;
Run Code Online (Sandbox Code Playgroud)
...它应该自动授予从现在开始创建的任何新表和模式。
有 1000 < n < 10000 个分片/模式,因此为每个分片/模式单独授予是不切实际的。
如何为所有现有模式(所有分片)中的所有现有表授予角色?
或者更好的是,我可以为所有模式 GRANTLIKE 'shard%'吗?
我正在尝试在 Postgres 数据库中创建两个用户 - 一个具有对两个模式中所有表的读写访问权限,另一个具有对相同模式的读写创建(即,能够进行 DDL 更改)。
我目前有这些陈述。
CREATE SCHEMA
schema_a;
CREATE SCHEMA
schema_b;
CREATE ROLE read;
CREATE ROLE read_write;
CREATE ROLE read_write_create;
GRANT USAGE ON SCHEMA schema_a, schema_b TO read;
GRANT SELECT ON ALL TABLES IN SCHEMA schema_a, schema_b TO read;
GRANT INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA schema_a, schema_b TO read_write;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA schema_a, schema_b TO read_write;
GRANT ALL ON SCHEMA schema_a, schema_b TO read_write_create;
GRANT read to read_write;
GRANT …Run Code Online (Sandbox Code Playgroud) 我正在将应用程序从 SQL Server 移植到 PostgreSQL。其中大部分很简单,因为应用程序只真正执行简单的选择、插入和更新。但是我需要创建一个用户来访问数据库。SQL Sever 代码像这样创建它的用户:
USE [master] CREATE LOGIN [ExampleUserName] WITH PASSWORD = 'ExamplePassword', CHECK_EXPIRATION=OFF, CHECK_POLICY=ON;
USE [ExampleDB];
CREATE USER [ExampleUserName] FOR LOGIN [ExampleUserName];
ALTER ROLE [db_datawriter] ADD MEMBER [ExampleUserName];
ALTER ROLE [db_datareader] ADD MEMBER [ExampleUserName];
Run Code Online (Sandbox Code Playgroud)
什么是 PostgreSQL 中的等价物?