pg用户、角色、权限

本文详细解释了PostgreSQL数据库中角色、用户权限的概念,如何创建用户并指定权限,以及通过GRANT和REVOKE命令进行权限管理。特别关注了特殊权限、库、模式和表级别的权限分配示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pg 角色(role=用户(user

一系列权限的集合,设定好的角色a、b、c等等,按需将角色给到用户,方便不用一个个权限给用户。

一个用户也是一个角色,可以把用户赋予给另个用户。

用户、角色是全局性的,不同库中看到的用户都是相同的。

初始化数据库时自动建了个与安装用户(系统)同名的超级用户,一般是postgres

默认建出来的user有登陆权限,role没有登陆权限。其他没区别。

任何数据库的逻辑结构对象(包括库)都属于某个用户。

创建用户

CREATE ROLE name [ [ WITH ] option [ ... ] ]

=

CREATE USER name [ [ WITH ] option [ ... ] ]

opyion可以是以下内容

·SUPERUSER|NOSUPERUSER:表示创建出来的用户是否为超级用户。当然只有超级用户才能创建超级用户。

·CREATEDB|NOCREATEDB:指定创建出来的用户是否有执行CREATE DATABASE的权限。

·CREATEROLE|NOCREATEROLE:指定创建出来的用户是否有创建其他角色的权限。

·CREATEUSER|NOCREATEUSER:指定创建出来的用户是否有创建其他用户的权限。

·INHERIT|NOINHERIT:如果创建的用户拥有某个或某几个角色,这时若指定INHERIT,则表示用户自动拥有相应角色的权限,否则该用户没有相应角色的权限。

·LOGIN|NOLOGIN:创建出来的用户是否有LOGIN权限,可以临时禁止用户的LOGIN权限,此时用户无法连接到数据库。

·CONNECTION LIMIT connlimit:这个参数指明了该用户可以使用的并发连接的数量。默认值是“-1”,表示没有限制。

·[ENCRYPTED|UNENCRYPTED]PASSWORD 'password':用于控制存储在系统表中的口令是否加密。

·VALID UNTIL 'timestamp':密码失效时间,如果不指定该子句,那么口令将永远有效。

·IN ROLE role_name [,...]:指定用户成为哪些角色的成员,请注意,没有任何选项可以把新角色添加为管理员,只有使用独立的GRANT命令才行。

·IN GROUP role_name [,...]:与IN ROLE相同,是已过时的语法。

·ROLE role_name [,...]:role_name将成为这个新建的角色的成员。

·ADMIN role_name [,...]:role_name将有这个新建角色的WITHADMIN OPTION权限。

·USER role_name [,...]:与ROLE子句相同,但已过时。

·SYSID uid:此子句主要是为了SQL向下兼容,实际没有什么用途。

权限概念:

任何数据库的逻辑结构对象(包括库)都属于某个用户。

创建用户时指定的权限(后续可alter role修改):

·超级用户的权限。

·创建数据库的权限。

·是否允许LOGIN的权限。

另一类(grantrevote来管理的权限)

·在数据库中创建模式(SCHEMA)。

·允许在指定的数据库中创建临时表的权限。

·连接某个数据库的权限。

·在模式中创建数据库对象的权限,如创建表、视图、函数等。

·在一些表中做SELECT、UPDATE、INSERT、DELETE等操作的 权限。

·在一张具体的表的列上进行SELECT、UPDATE、INSERT操作的 权限。

·对序列进行查询(执行序列的currval函数)、使用(执行序列的 currval函数和nextval函数)、更新的权限。

·在声明表上创建触发器的权限。

·把表、索引等建到指定表空间的权限。

权限管理层次:

1.特殊权限(登录、超级用户、建库权限、建用户权限 等等)

2.库中创建schema的权限

3.schema中创建  对象的权限(表、索引等)

4.表的增删改查权限

5.操作表的某些字段的权限

一些例子:

将查询myhaha表的权限赋予给所有用户(public

GRANT select on TABLE myhaha to public;

想要给readonly用户只读权限

1.收回任何用户可在public schema中建表权限(先收回,后面再单独赋予给其他用户)

REVOKE CREATE ON SCHEMA public from public;

2.将现存的所有表的只读权限给到readonly用户

GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

3.将后面建的所有表的只读权限给到readonly用户

ALTER DEFAULT PRIVILEGES IN SCHEMA public grant select on tables to readonly;

格式:

GRANT some_privileges ON database_object_type object_name TO role_name;

REVOKE some_privileges ON database_object_type object_name FROM role_name;

some_privileges

ddl么有专门的权限,一般就是create权限。

### 如何在 PostgreSQL 中授予用户 SELECT 权限PostgreSQL 数据库中,可以通过 `GRANT` 命令向特定用户授予权限。如果要为某个用户授予表上的 `SELECT` 权限,则需要指定该用户的名称以及目标对象(如表、视图等)。以下是具体方法: #### 授予单个表的 SELECT 权限 假设有一个名为 `test_table` 的表位于模式 `public` 下,并希望将其 `SELECT` 权限授予用户 `testUser`,可以运行以下 SQL 语句: ```sql GRANT SELECT ON TABLE public.test_table TO testUser; ``` 此操作会允许 `testUser` 用户查询 `public.test_table` 表中的数据[^2]。 #### 批量授予多个表的 SELECT 权限 如果需要一次性授予某用户对整个模式下所有表的 `SELECT` 权限,可使用如下命令: ```sql GRANT SELECT ON ALL TABLES IN SCHEMA public TO testUser; ``` 这将使 `testUser` 能够访问当前存在于 `public` 模式下的所有表的数据。 需要注意的是,上述命令仅适用于已经存在的表;对于未来新增加到同一模式内的表,默认情况下不会自动继承这些权限。为了处理这种情况,还需要配置默认权限。 #### 配置未来的默认权限 通过修改默认 ACL 可以让新创建的对象也具备相应的权限设定。下面的例子展示了怎样设置当有新的关系被加入至公共方案时赋予某些角色读取权利的方法之一: ```sql ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO testUser; ``` 这样做的好处在于即使之后再增加任何表格或者其它类型的实体项目进入这个特别指出的空间里头去的话,那么刚才提到的那个特殊身份就会立刻获得查看它们里面存储的信息的能力了。 另外值得注意的一点就是关于序列(sequence),像例子当中所展示出来的那样虽然给予了`tqoai`使用权(`USAGE`)但是并不足以让它能够调用`setval()`函数因为那还需要额外写入(write)级别的许可才行[^1]。 最后提醒一下安全方面的事情,在实际生产环境中应该遵循最小特权原则(Minimal Privilege Principle),即只为完成工作所需的最少功能开放给相关人员/程序账号即可[^3]. ```python # 示例 Python 代码连接 PostgreSQL 并执行授权语句 import psycopg2 try: connection = psycopg2.connect( dbname="your_db_name", user="admin_user", password="secure_password", host="localhost" ) cursor = connection.cursor() query = """ GRANT SELECT ON TABLE your_schema.your_table TO target_user; """ cursor.execute(query) connection.commit() except Exception as e: print(f"Error occurred: {e}") finally: if connection: cursor.close() connection.close() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汪灵骅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值