rz.*_*rz. 88 postgresql permissions sql
我试图将给定数据库的所有表的所有权限授予新的 postgres 用户(不是所有者)。似乎GRANT ALL PRIVILEGES ON DATABASE my_db TO new_user;没有这样做。成功运行上述命令后(作为 postgres 用户),我以 new_user 的身份得到以下信息:
$ psql -d my_db
my_db => SELECT * FROM a_table_in_my_db;
ERROR: permission denied for relation a_table_in_my_db
Run Code Online (Sandbox Code Playgroud)
两个问题:
1) 如果没有授予 my_db 上所有表的所有权限,那么上面的命令会做什么?
2)将所有表的所有权限授予用户的正确方法是什么?(包括将来创建的所有表)
Ste*_*day 102
您的问题的答案来自在线 PostgreSQL 8.4 文档。
GRANT ALL PRIVILEGES ON DATABASE授予CREATE,CONNECT以及TEMPORARY一个数据库,一个角色的特权(用户适当地称为角色)。这些特权实际上都不允许角色从表中读取数据;SELECT为此需要对表的特权。
我不确定是否有一种“正确”的方法可以将所有表的所有权限授予一个角色。确保给定角色对表拥有所有权限的最佳方法是确保该角色拥有该表。默认情况下,每个新创建的对象都归创建它的角色所有,因此如果您希望角色拥有表的所有权限,请使用该角色来创建它。
PostgreSQL 9.0 引入了以下几乎是您想要的语法:
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO new_user;
问题在于,如果您在默认“公共”架构之外的架构中创建表,则这GRANT不适用于它们。如果您确实使用非公共模式,则必须分别拥有GRANT这些模式的权限。
小智 17
可以设置多个登录来充当数据库所有者:
create role dbowner nologinalter database mydb owner dbownergrant dbowner to user1, user2现在,如果 user1 或 user2 登录,他们就拥有对“mydb”的所有权限,无需任何进一步的授权。
但是,我会仔细考虑这个解决方案。让您的 Web 应用程序使用这些登录名以避免在架构更新时创建额外授权的痛苦是很诱人的,但您正在以这种方式删除一种非常有用的保护形式。如果您确实需要多个“管理员”,请使用上述解决方案,但坚持使用上面的“授予架构中所有表的所有权限......”模式以登录您的“正常使用”应用程序。
在 PostgreSQL 12 及更高版本中,可以将数据库中表的所有权限授予角色/用户/帐户。
语法是:
GRANT ALL ON table_name TO role_name;
Run Code Online (Sandbox Code Playgroud)
如果要将其授予数据库中的所有表,则语法为:
GRANT ALL ON ALL TABLES TO role_name;
Run Code Online (Sandbox Code Playgroud)
如果要将其授予数据库中模式的所有表,则语法为:
GRANT ALL ON ALL TABLES IN SCHEMA schema_name TO role_name;
Run Code Online (Sandbox Code Playgroud)
这是我如何做到的:
首先,我登录到 Postgres 数据库服务器:
psql -U postgres
Run Code Online (Sandbox Code Playgroud)
输出
psql (12.6 (Ubuntu 12.6-0ubuntu0.20.04.1))
Type "help" for help.
Run Code Online (Sandbox Code Playgroud)
接下来,我创建了一个数据库用户/角色/帐户:
CREATE ROLE alice4 WITH LOGIN PASSWORD 'securePass1';
Run Code Online (Sandbox Code Playgroud)
输出
CREATE ROLE
Run Code Online (Sandbox Code Playgroud)
接下来,我在 postgres 数据库中创建了一个表:
create table candidates (
candidate_id int generated always as identity,
first_name varchar(100) not null,
last_name varchar(100) not null,
email varchar(255) not null unique,
phone varchar(25) not null,
primary key(candidate_id)
);
Run Code Online (Sandbox Code Playgroud)
输出
CREATE TABLE
Run Code Online (Sandbox Code Playgroud)
接下来,我将candidates表上的所有权限授予帐户/用户/角色alice4
GRANT ALL ON candidates TO alice4;
Run Code Online (Sandbox Code Playgroud)
输出
GRANT
Run Code Online (Sandbox Code Playgroud)
接下来,注销 postgres 数据库和postgres帐户/用户/角色:
exit
Run Code Online (Sandbox Code Playgroud)
接下来,我使用alice4帐户/用户/角色登录到 Postgres 数据库:
psql -U alice4 -W postgres
Run Code Online (Sandbox Code Playgroud)
输出
Password:
psql (12.6 (Ubuntu 12.6-0ubuntu0.20.04.1))
Type "help" for help.
Run Code Online (Sandbox Code Playgroud)
接下来,我将数据插入到candidates之前创建的表中:
INSERT INTO candidates(first_name, last_name, email, phone)
VALUES('Joe','Com','joe.com@example.com','408-111-2222');
Run Code Online (Sandbox Code Playgroud)
输出
INSERT 0 1
Run Code Online (Sandbox Code Playgroud)
接下来,我选择了candidates之前创建的表中的所有数据:
SELECT * FROM candidates;
Run Code Online (Sandbox Code Playgroud)
输出
candidate_id | first_name | last_name | email | phone
--------------+------------+-----------+---------------------+--------------
1 | Joe | Com | joe.com@example.com | 408-111-2222
(1 row)
Run Code Online (Sandbox Code Playgroud)
就这样
我希望这有帮助
| 归档时间: |
|
| 查看次数: |
213834 次 |
| 最近记录: |