pg18权限篇章

一,权限介绍

1. 通用语法结构

sql

复制代码
GRANT { {权限1, 权限2, ...} | ALL [PRIVILEGES] }
   ON [对象类型] 对象名
   TO 角色 [WITH GRANT OPTION];
  • 权限:指定要授予的一个或多个权限,用逗号分隔。

  • ALL [PRIVILEGES]:一次性授予该对象类型支持的所有权限。

  • 对象类型 :某些对象类型在 ON 后面需要明确写出(如 DATABASESCHEMA 等),有些可以省略(如表、视图默认为 TABLE)。

  • WITH GRANT OPTION:允许被授予者将获得的权限再转授给其他人。


2. 各对象类型的详细 GRANT

🔹 表、视图、物化视图(TABLE, VIEW, MATERIALIZED VIEW)

  • 适用权限SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER, MAINTAIN

  • 语法

    sql

    复制代码
    GRANT {权限列表 | ALL} ON TABLE 表名 TO 角色;
    -- TABLE 关键字可以省略(默认就是表)
  • 示例

    sql

    复制代码
    GRANT SELECT, INSERT ON employees TO joe;
    GRANT ALL ON active_customers TO PUBLIC;

🔹 列级别(COLUMN)

  • 适用权限SELECT, INSERT, UPDATE, REFERENCES(只能针对特定列)

  • 语法

    sql

    复制代码
    GRANT {权限 (列1, 列2, ...) | ALL (列1, 列2, ...)} ON TABLE 表名 TO 角色;
  • 示例

    sql

    复制代码
    GRANT UPDATE (salary, bonus) ON employees TO hr_clerk;
    GRANT SELECT (name, email) ON customers TO support_team;

🔹 序列(SEQUENCE)

  • 适用权限USAGE, SELECT, UPDATE

  • 语法

    sql

    复制代码
    GRANT {权限列表 | ALL} ON SEQUENCE 序列名 TO 角色;
  • 示例

    sql

    复制代码
    GRANT USAGE ON order_id_seq TO joe;

🔹 数据库(DATABASE)

  • 适用权限CONNECT, CREATE, TEMPORARY(别名 TEMP

  • 语法

    sql

    复制代码
    GRANT {权限列表 | ALL} ON DATABASE 数据库名 TO 角色;
  • 示例

    sql

    复制代码
    GRANT CONNECT, TEMPORARY ON DATABASE mydb TO joe;

🔹 模式(SCHEMA)

  • 适用权限CREATE, USAGE

  • 语法

    sql

    复制代码
    GRANT {权限列表 | ALL} ON SCHEMA 模式名 TO 角色;
  • 示例

    sql

    复制代码
    GRANT CREATE, USAGE ON SCHEMA public TO joe;

🔹 函数 / 存储过程(FUNCTION / PROCEDURE)

  • 适用权限EXECUTE

  • 语法

    sql

    复制代码
    GRANT {EXECUTE | ALL} ON FUNCTION 函数名(参数类型列表) TO 角色;
    GRANT {EXECUTE | ALL} ON PROCEDURE 存储过程名(参数类型列表) TO 角色;
  • 示例

    sql

    复制代码
    GRANT EXECUTE ON FUNCTION calculate_tax(numeric) TO joe;

🔹 语言(LANGUAGE)

  • 适用权限USAGE

  • 语法

    sql

    复制代码
    GRANT {USAGE | ALL} ON LANGUAGE 语言名 TO 角色;
  • 示例

    sql

    复制代码
    GRANT USAGE ON LANGUAGE plpgsql TO joe;

🔹 数据类型 / 域(TYPE / DOMAIN)

  • 适用权限USAGE

  • 语法

    sql

    复制代码
    GRANT {USAGE | ALL} ON TYPE 类型名 TO 角色;
    GRANT {USAGE | ALL} ON DOMAIN 域名 TO 角色;
  • 示例

    sql

    复制代码
    GRANT USAGE ON TYPE address_type TO joe;

🔹 外部数据包装器(FOREIGN DATA WRAPPER)

  • 适用权限USAGE

  • 语法

    sql

    复制代码
    GRANT {USAGE | ALL} ON FOREIGN DATA WRAPPER 包装器名 TO 角色;
  • 示例

    sql

    复制代码
    GRANT USAGE ON FOREIGN DATA WRAPPER postgres_fdw TO joe;

🔹 外部服务器(FOREIGN SERVER)

  • 适用权限USAGE

  • 语法

    sql

    复制代码
    GRANT {USAGE | ALL} ON FOREIGN SERVER 服务器名 TO 角色;
  • 示例

    sql

    复制代码
    GRANT USAGE ON FOREIGN SERVER remote_server TO joe;

🔹 大对象(LARGE OBJECT)

  • 适用权限SELECT, UPDATE

  • 语法

    sql

    复制代码
    GRANT {权限列表 | ALL} ON LARGE OBJECT 大对象OID TO 角色;
  • 示例

    sql

    复制代码
    GRANT SELECT ON LARGE OBJECT 12345 TO joe;

🔹 表空间(TABLESPACE)

  • 适用权限CREATE

  • 语法

    sql

    复制代码
    GRANT {CREATE | ALL} ON TABLESPACE 表空间名 TO 角色;
  • 示例

    sql

    复制代码
    GRANT CREATE ON TABLESPACE fast_space TO joe;

🔹 配置参数(PARAMETER)

  • 适用权限SET, ALTER SYSTEM

  • 语法

    sql

    复制代码
    GRANT {权限列表 | ALL} ON PARAMETER 参数名 TO 角色;
  • 示例

    sql

    复制代码
    GRANT SET ON PARAMETER work_mem TO joe;
    GRANT ALTER SYSTEM ON PARAMETER shared_buffers TO admin;

3. 其他说明

  • PUBLIC 角色:表示所有当前及未来的用户。

    sql

    复制代码
    GRANT SELECT ON employees TO PUBLIC;
  • WITH GRANT OPTION:允许被授予者转授权限。

    sql

    复制代码
    GRANT SELECT ON employees TO joe WITH GRANT OPTION;
  • ALL [PRIVILEGES] :一次性授予所有适用权限,但不包含WITH GRANT OPTION,需要单独加。

  • 多个对象:可以一次授予多个对象(同类型),用逗号分隔:

    sql

    复制代码
    GRANT SELECT ON table1, table2, table3 TO joe;

4. 收回权限(REVOKE)

对应的收回命令语法类似,只需将 GRANT 换成 REVOKE,并且可能需要 FROM 而不是 TO,以及处理级联回收等选项。

sql

复制代码
REVOKE {权限列表 | ALL} ON [对象类型] 对象名 FROM 角色;

示例:

sql

复制代码
REVOKE UPDATE ON employees FROM joe;
REVOKE ALL ON DATABASE mydb FROM PUBLIC;

二,权限应用

1,创建只读用户

sql 复制代码
--创建doki_database 
CREATE DATABASE doki_database ;
-- 创建用户doki
CREATE USER doki PASSWORD 'password';
-- 更新用户的默认事务为只读的(这意味着它只能执行读操作,不能CUD)
ALTER USER doki set default_transaction_read_only=on;
-- 授权连接
GRANT CONNECT ON DATABASE doki_database TO doki;
-- 授权public的使用
GRANT USAGE ON SCHEMA PUBLIC TO doki;
-- 切换到doki_database
\c doki_database
-- 授予doki_database下public下所有表、序列、函数
GRANT SELECT ON ALL TABLES IN SCHEMA public TO doki;
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO doki;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO doki;
-- 对于新建的对象,也授予上面三个权限,sql命令执行后的新表起作用,旧表不起作用
--ALTER DEFAULT PRIVILEGES 
--    [ FOR { ROLE | USER } target_role [, ...] ] 
--    [ IN SCHEMA schema_name [, ...] ] 
--    abbreviated_grant_or_revoke;

--授权grant
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO doki;
ALTER DEFAULT PRIVILEGES  IN SCHEMA public GRANT SELECT ON SEQUENCES TO doki;
ALTER DEFAULT PRIVILEGES  IN SCHEMA public GRANT EXECUTE ON FUNCTIONS TO doki;
--切用户postgres
\c doki_database  postgres;
create table lga(name varchar(10));
insert into lga values('xxxx');
--切用户 doki
\c doki_database  doki;
--验证
select * from lga;
delete from lga;
drop table lga;
create table t1(name varchar(10));

--回收revoke
-- 回收在 public 模式中未来表的 SELECT 权限
ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE SELECT ON TABLES FROM doki;

-- 回收在 public 模式中未来序列的 SELECT 权限
ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE SELECT ON SEQUENCES FROM doki;

-- 回收在 public 模式中未来函数的 EXECUTE 权限
ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE EXECUTE ON FUNCTIONS FROM doki;
相关推荐
数据知道2 小时前
PostgreSQL:详解 PostGIS 地理信息数据处理
数据库·postgresql
剑之所向2 小时前
Mysql参数化
数据库·mysql·oracle
_千思_2 小时前
【小白说】数据库系统概念 3
数据库
海兰2 小时前
elasticsearch学习之基本概念-向量数据库
数据库·学习·elasticsearch
014-code2 小时前
Spring Boot 集成 Neo4j 图数据库实战教程
java·数据库·neo4j
大鹏说大话3 小时前
深入理解 MySQL 查询语句的执行顺序与函数调用机制
数据库·mysql
SQL必知必会3 小时前
精通递归 CTE:SQL 的盗梦空间
数据库·sql
知识分享小能手3 小时前
SQL Server 2019入门学习教程,从入门到精通,SQL Server 2019 游标 — 语法知识点及使用方法详解(14)
数据库·学习·sqlserver
青春:一叶知秋3 小时前
【Redis存储】Redis客户端
java·数据库·redis