pg_namespace
是 PostgreSQL/Hologres 中存储命名空间(模式/schema)信息的核心系统目录表。
pg_namespace 的主要作用
- 记录数据库中所有的命名空间(模式)信息:每个 schema 对应一条记录
- 管理数据库对象的逻辑分组:通过 schema 实现对象分类和组织
- 控制命名空间的访问权限:存储每个 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;
字段详细说明
- nspname (name 类型,非空)
-
- 存储 schema 的名称
- 系统内置 schema 如
pg_catalog
,public
,information_schema
等都会在此表中记录
- nspowner (oid 类型,非空)
-
- 记录 schema 的所有者
- 关联到
pg_authid
表中的 OID - 决定了谁可以修改或删除这个 schema
- nspacl (aclitem[] 类型)
-
- 存储 schema 的访问控制列表(ACL)
- 格式示例:
{user1=r/user1,user2=rw/user1}
- 控制哪些用户/角色可以访问此 schema 中的对象
重要注意事项
- 不要直接修改系统表:您提供的代码包含创建
pg_namespace
的语句,但直接修改系统表极其危险,可能导致数据库损坏 - 正确的 schema 操作方法:
-- 创建 schema
CREATE SCHEMA myschema;
-- 修改 schema 所有者
ALTER SCHEMA myschema OWNER TO newowner;
-- 删除 schema
DROP SCHEMA myschema;
- 查询 schema 信息的正确方式:
-- 查看所有 schema
SELECT nspname, pg_get_userbyid(nspowner) as owner
FROM pg_namespace;
-- 查看特定 schema 的权限
SELECT nspname, nspacl FROM pg_namespace WHERE nspname = 'public';
- 系统默认 schema:
-
pg_catalog
:存储系统表和内置函数public
:默认创建对象的 schemainformation_schema
:标准信息模式视图
安全警告
您提供的代码片段显示您可能尝试重新创建或修改 pg_namespace
表。这是极其危险的操作,因为:
- 会导致数据库无法识别现有 schema
- 可能使所有数据库对象无法访问
- 会导致数据库服务崩溃
- 阿里云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
= TRUNCATEx
= REFERENCESt
= TRIGGERX
= EXECUTEU
= USAGEC
= CREATEc
= CONNECTT
= TEMPORARYarwdDxt
= ALL PRIVILEGES (对于表)
实际权限效果
根据您提供的ACL,不同角色的权限如下:
- xxx_admin:
-
- 可以查看schema中的对象
- 可以在该schema中创建新表、视图等
- xxx_viewer:
-
- 仅能查看schema中的对象
- 不能创建新对象
- 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;
注意事项:
- 直接修改nspacl数组风险很高,应使用标准GRANT/REVOKE语句
- 权限变更会立即生效,不需要重启服务
- Hologres可能有额外的权限控制层,特别是在阿里云环境中