PostgreSQL/Hologres 系统表 pg_namespace 详解

发布于:2025-06-22 ⋅ 阅读:(17) ⋅ 点赞:(0)

pg_namespace 是 PostgreSQL/Hologres 中存储命名空间(模式/schema)信息的核心系统目录表。

pg_namespace 的主要作用

  1. 记录数据库中所有的命名空间(模式)信息每个 schema 对应一条记录
  2. 管理数据库对象的逻辑分组:通过 schema 实现对象分类和组织
  3. 控制命名空间的访问权限:存储每个 schema 的 ACL(访问控制列表)

您提供的 pg_namespace 字段定义

CREATE TABLE pg_catalog.pg_namespace (
    nspname name NOT NULL,      -- 命名空间(模式)的名称
    nspowner oid NOT NULL,      -- 命名空间所有者的OID(关联pg_authid)
    nspacl aclitem[]            -- 访问权限(ACL数组)
) WITH OIDS;

COMMENT ON TABLE pg_catalog.pg_namespace IS NULL;
ALTER TABLE pg_catalog.pg_namespace OWNER TO holo_admin;

字段详细说明

  1. nspname (name 类型,非空)
    • 存储 schema 的名称
    • 系统内置 schema 如 pg_catalog, public, information_schema 等都会在此表中记录
  1. nspowner (oid 类型,非空)
    • 记录 schema 的所有者
    • 关联到 pg_authid 表中的 OID
    • 决定了谁可以修改或删除这个 schema
  1. nspacl (aclitem[] 类型)
    • 存储 schema 的访问控制列表(ACL)
    • 格式示例:{user1=r/user1,user2=rw/user1}
    • 控制哪些用户/角色可以访问此 schema 中的对象

重要注意事项

  1. 不要直接修改系统表:您提供的代码包含创建 pg_namespace 的语句,但直接修改系统表极其危险,可能导致数据库损坏
  2. 正确的 schema 操作方法
-- 创建 schema
CREATE SCHEMA myschema;

-- 修改 schema 所有者
ALTER SCHEMA myschema OWNER TO newowner;

-- 删除 schema
DROP SCHEMA myschema;
  1. 查询 schema 信息的正确方式
-- 查看所有 schema
SELECT nspname, pg_get_userbyid(nspowner) as owner 
FROM pg_namespace;

-- 查看特定 schema 的权限
SELECT nspname, nspacl FROM pg_namespace WHERE nspname = 'public';
  1. 系统默认 schema
    • pg_catalog:存储系统表和内置函数
    • public默认创建对象的 schema
    • information_schema:标准信息模式视图

安全警告

您提供的代码片段显示您可能尝试重新创建或修改 pg_namespace 表。这是极其危险的操作,因为:

  1. 会导致数据库无法识别现有 schema
  2. 可能使所有数据库对象无法访问
  3. 会导致数据库服务崩溃
  4. 阿里云Hologres不支持此类操作

如需管理 schema,请始终使用标准的 DDL 语句(CREATE/ALTER/DROP SCHEMA)而非直接操作系统表。

补充:

ACL条目解析

1. fenghuo_admin=UC/holo_admin
  • 用户/角色fenghuo_admin
  • 权限UC
    • U = USAGE (允许使用schema中的对象)
    • C = CREATE (允许在schema中创建新对象)
  • 授权者holo_admin

2. fenghuo_viewer=U/holo_admin

  • 用户/角色:xxx_viewer
  • 权限U (仅USAGE权限)
  • 授权者holo_admin

3. fenghuo_developer=UC/holo_admin

  • 用户/角色:xxx_developer
  • 权限UC (USAGE + CREATE)
  • 授权者holo_admin

ACL格式说明

PostgreSQL/Hologres的ACL条目通用格式为:

username=privileges/grantor

权限字母含义:

  • r = SELECT (读)
  • w = UPDATE (写)
  • a = INSERT (增)
  • d = DELETE (删)
  • D = TRUNCATE
  • x = REFERENCES
  • t = TRIGGER
  • X = EXECUTE
  • U = USAGE
  • C = CREATE
  • c = CONNECT
  • T = TEMPORARY
  • arwdDxt = ALL PRIVILEGES (对于表)

实际权限效果

根据您提供的ACL,不同角色的权限如下:

  1. xxx_admin
    • 可以查看schema中的对象
    • 可以在该schema中创建新表、视图等
  1. xxx_viewer
    • 仅能查看schema中的对象
    • 不能创建新对象
  1. xxx_developer
    • 与admin相同的UC权限
    • 可以查看和创建对象

管理此类权限

查询权限:

SELECT nspname, nspacl FROM pg_namespace WHERE nspname = 'your_schema';

修改权限(推荐方式):

-- 授予USAGE和CREATE权限
GRANT USAGE, CREATE ON SCHEMA schema_name TO fenghuo_admin;

-- 仅授予USAGE权限
GRANT USAGE ON SCHEMA schema_name TO fenghuo_viewer;

-- 撤销权限
REVOKE CREATE ON SCHEMA schema_name FROM fenghuo_developer;

注意事项:

  1. 直接修改nspacl数组风险很高,应使用标准GRANT/REVOKE语句
  2. 权限变更会立即生效,不需要重启服务
  3. Hologres可能有额外的权限控制层,特别是在阿里云环境中

网站公告

今日签到

点亮在社区的每一天
去签到