网站建设资讯

NEWS

网站建设资讯

PostgreSQL对现有,新建的表和视图授权给用户

安定网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、响应式网站设计等网站项目制作,到程序开发,运营维护。创新互联成立与2013年到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联

在 PostgreSQL 中,对现有表、新建表及视图的授权需通过 `GRANT` 命令实现,根据对象类型(表/视图)和操作时机(已存在/新建),授权方式略有差异。以下是详细操作指南:

一、核心授权语法

PostgreSQL 的授权基于“对象+权限”,常用权限包括:  
- 数据操作:`SELECT`(查询)、`INSERT`(插入)、`UPDATE`(更新)、`DELETE`(删除)  
- 结构修改:`ALTER`(修改表结构)、`DROP`(删除对象)  
- 所有权:`ALL PRIVILEGES`(所有权限,谨慎使用)  

基本语法:  
```sql
-- 对指定对象授权
GRANT 权限列表 ON 对象类型 对象名 TO 用户名;

-- 示例:授予用户查询表的权限
GRANT SELECT ON TABLE 表名 TO 用户名;
```

二、对**现有表**授权

对已存在的表授权,直接指定表名和权限即可。  

#1. 单个表授权
```sql
-- 授予用户 user1 对表 t1 的查询和插入权限
GRANT SELECT, INSERT ON TABLE t1 TO user1;

-- 授予用户 user1 对表 t1 的所有操作权限(包括结构修改,谨慎使用)
GRANT ALL PRIVILEGES ON TABLE t1 TO user1;
```

#2. 多个表批量授权
若需对多个表授权,可通过 `INFORMATION_SCHEMA` 查询表名批量生成授权语句(避免手动输入):  
```sql
-- 生成对当前数据库中所有表授予 SELECT 权限的语句(替换 user1 为实际用户名)
SELECT 'GRANT SELECT ON TABLE ' || table_name || ' TO user1;' 
FROM information_schema.tables 
WHERE table_schema = 'public'; -- 假设表在 public 模式下
```
执行查询结果中的语句,即可批量授权。


三、对**新建表**自动授权

若希望用户对**未来新建的表**自动拥有权限,需授权“模式(Schema)”的权限,并设置默认权限。  

#1. 理解“模式(Schema)”
PostgreSQL 中表默认存储在 `public` 模式下,新建表的权限继承自模式的设置。若需让用户自动获得新表权限,需两步:  

#2. 授权模式的 `USAGE` 权限(允许访问模式)
```sql
-- 允许 user1 访问 public 模式(否则无法看到模式下的表)
GRANT USAGE ON SCHEMA public TO user1;
```

#3. 设置“默认权限”(对未来新建表生效)
通过 `ALTER DEFAULT PRIVILEGES` 定义新表的默认权限:  
```sql
-- 对当前用户(执行该命令的用户)未来在 public 模式下新建的表,自动授予 user1 SELECT 权限
ALTER DEFAULT PRIVILEGES IN SCHEMA public 
GRANT SELECT ON TABLES TO user1;

-- 若要对所有用户新建的表生效(需超级权限),加上 FOR ROLE 所有建表用户
ALTER DEFAULT PRIVILEGES FOR ROLE 建表用户 IN SCHEMA public 
GRANT SELECT, INSERT ON TABLES TO user1;
```
- 此后在 `public` 模式下新建的表,`user1` 会自动拥有指定权限。
- 若表在其他模式(如 `schema1`),替换 `public` 为对应模式名即可。


四、对**视图**授权

视图的授权方式与表完全一致(视图本质是“虚拟表”)。  

#1. 对现有视图授权
```sql
-- 授予 user1 对视图 v1 的查询权限
GRANT SELECT ON TABLE v1 TO user1;

-- 若视图需要修改(如通过视图插入数据),需授予对应权限(前提是视图可更新)
GRANT INSERT, UPDATE ON TABLE v1 TO user1;
```

#2. 对未来新建视图自动授权
与新建表类似,通过默认权限设置:  
```sql
-- 对未来新建的视图,自动授予 user1 SELECT 权限
ALTER DEFAULT PRIVILEGES IN SCHEMA public 
GRANT SELECT ON TABLES TO user1; -- 视图属于 TABLES 类型,与表共用该设置
```

五、常用场景示例

#1. 给用户只读权限(现有+新建表/视图)

```sql
-- 1. 授权现有表和视图
GRANT SELECT ON ALL TABLES IN SCHEMA public TO user1;

-- 2. 允许访问模式
GRANT USAGE ON SCHEMA public TO user1;

-- 3. 未来新建表/视图自动获得只读权限
ALTER DEFAULT PRIVILEGES IN SCHEMA public 
GRANT SELECT ON TABLES TO user1;
```

#2. 回收权限(撤销授权)
若需取消权限,使用 `REVOKE` 命令:  
```sql
-- 撤销 user1 对表 t1 的 UPDATE 权限
REVOKE UPDATE ON TABLE t1 FROM user1;

-- 撤销未来新建表的默认权限
ALTER DEFAULT PRIVILEGES IN SCHEMA public 
REVOKE SELECT ON TABLES FROM user1;
```

1. **权限继承**:若用户属于某个角色(Role),可授权给角色,角色内用户自动继承权限(推荐用角色管理权限,避免重复操作)。  
2. **模式隔离**:不同模式下的表/视图需单独授权,默认模式为 `public`,若使用自定义模式需指定。  
3. **超级用户**:超级用户(如 `postgres`)默认拥有所有权限,无需额外授权。  

通过以上方式,可灵活控制用户对表和视图的访问权限,兼顾安全性和易用性。


文章标题:PostgreSQL对现有,新建的表和视图授权给用户
文章URL:https://xinyudec.cn/article/iepoed.html