pg(hgdb)权限实验

本文通过实例演示了在PostgreSQL中创建用户和角色,并详细解释了如何通过GRANT和REVOKE命令来控制用户对数据库对象(如表和模式)的访问权限。实验展示了即使用户被授予表的SELECT权限,如果没有相应模式的USAGE权限,也无法访问该模式下的对象。最后,讨论了如何通过赋予或撤销对整个schema的使用权来进一步限制用户操作。
创建用户的语句为:
CREATE ROLE guest LOGIN NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
注意上述Role guest拥有LOGIN的权限,所以叫它用户。


创建角色的语句为:
CREATE ROLE "group" NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
注意这里没有LOGIN权限,所以是角色。


上述角色和用户的创建语句中,都没有赋予超级用户、创建数据库等权限。


怎么样控制登录用户操作数据库对象的权限呢?
答案是让用户成为角色的成员,此时用户即可拥有角色的权限,进一步限制了登录用户操作数据库对象的权限。
如把上述角色group赋予guest用户:
GRANT "group" TO guest;
之后,guest用户就拥有了group角色所拥有的数据库对象权限。
==============================================================================
highgo=# \c
You are now connected to database "highgo" as user "highgo".
highgo=# \du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 highgo    | Superuser, Create role, Create DB, Replication | {}
 
highgo=# create schema a;
CREATE SCHEMA
highgo=# create schema b;
CREATE SCHEMA


highgo=# create role a login password 'highgo123';
CREATE ROLE
highgo=# create role b login password 'highgo123';
CREATE ROLE
highgo=# alter schema a owner to a;
ALTER SCHEMA


highgo=# alter schema b owner to b;
ALTER SCHEMA


highgo=# create table a.test (id int);
CREATE TABLE
highgo=# insert into a.test values (1);
INSERT 0 1
highgo=# create table b.test (id int);
CREATE TABLE
highgo=# insert into b.test values (2);
INSERT 0 1


highgo=> \c
You are now connected to database "highgo" as user "a".
highgo=> select * from test;
错误:  对关系 test 权限不够
highgo=> select * from a.test;
错误:  对关系 test 权限不够
highgo=> select * from b.test;
错误:  对模式 b 权限不够
LINE 1: select * from b.test;
                      ^
 
highgo=# \c
You are now connected to database "highgo" as user "highgo". 
highgo=# grant select on a.test to a;
GRANT


highgo=> \c
You are now connected to database "highgo" as user "a".
highgo=> select * from a.test;
 id 
----
  1
(1 row)
highgo=> \c
You are now connected to database "highgo" as user "b".
highgo=> select * from a.test;
错误
<think>我们正在讨论的是Vastbase数据库(兼容PostgreSQL)中关于`pg_namespace`权限的授予问题。在PostgreSQL中,`pg_namespace`是系统表,存储了所有模式(schema)的信息。直接操作该系统表是不推荐的,而应该使用标准的SQL权限命令。 用户需求:在Vastbase中授予用户对`pg_namespace`的权限。 注意:在PostgreSQL/Vastbase中,我们通常不直接对`pg_namespace`表进行授权,因为它是系统表。但是,我们可以通过授予用户对特定模式(schema)的权限来间接实现。如果用户需要查询`pg_namespace`表,那么需要授予用户对该系统表的SELECT权限,但这通常只对超级用户开放,一般不建议这么做。 ### 正确理解需求 用户可能想要: 1. 授予用户创建模式权限(CREATE权限) 2. 授予用户对特定模式的使用权限(USAGE权限) 3. 授予用户对特定模式下对象的操作权限(如SELECT, INSERT等) 4. 或者,用户可能想要允许用户查看系统表`pg_namespace`(需要SELECT权限) ### 安全建议 - 直接对系统表授权(如`pg_namespace`)是非常危险的,通常只应由超级用户执行,且生产环境应避免。 - 推荐使用标准的模式权限管理命令。 ### 解决方案 #### 1. 授予创建模式权限 如果用户需要创建新的模式,可以授予数据库的CREATE权限: ```sql -- 授予用户创建模式权限(在数据库级别) GRANT CREATE ON DATABASE your_database TO your_user; ``` #### 2. 授予对现有模式的使用权限 ```sql -- 授予用户对特定模式的使用权限(USAGE) GRANT USAGE ON SCHEMA your_schema TO your_user; ``` #### 3. 授予对模式中对象的操作权限 ```sql -- 授予用户对特定模式中所有表的SELECT权限 GRANT SELECT ON ALL TABLES IN SCHEMA your_schema TO your_user; ``` #### 4. (不推荐)直接授予对pg_namespace表的查询权限 如果确实需要让普通用户能够查询`pg_namespace`系统表(通常不推荐,因为包含系统信息),可以: ```sql -- 将系统表pg_namespace的SELECT权限授予给用户 GRANT SELECT ON pg_namespace TO your_user; ``` ### 批量操作(适用于海量数据库) 如果需要在多个数据库或模式上进行操作,可以使用脚本(例如Python)批量执行。 ### 注意事项 - Vastbase与PostgreSQL在权限管理上高度兼容,上述命令在Vastbase中同样适用。 - 系统表权限的授予应极其谨慎,避免泄露敏感信息。 ### 相关问题 1. 在Vastbase中如何撤销对系统表的权限? 2. 如何批量授予用户对多个模式的USAGE权限? 3. Vastbase中如何查看用户对模式拥有的权限? 4. 授予用户CREATE权限后,用户能否修改系统模式? 5. Vastbase中系统表权限管理与PostgreSQL有哪些差异? [^1]: Vastbase官方文档建议使用标准的GRANT/REVOKE命令管理权限,直接操作系统表可能导致不可预知的结果。</think>在 Vastbase(兼容 PostgreSQL 的国产数据库)中授予用户 `pg_namespace` 权限时,**切勿直接操作系统表**,应使用标准 SQL 权限命令。以下是安全操作指南: --- ### ✅ 正确授权步骤(Vastbase G100 适用) #### 1. **授予模式操作权限(核心命令)** ```sql -- 授予用户对特定模式的 USAGE 权限(访问权限) GRANT USAGE ON SCHEMA schema_name TO user_name; -- 授予用户对模式内对象的操作权限(需分开执行) GRANT SELECT ON ALL TABLES IN SCHEMA schema_name TO user_name; -- 读权限 GRANT INSERT, UPDATE ON ALL TABLES IN SCHEMA schema_name TO user_name; -- 写权限 ``` #### 2. **授予系统表查看权限(谨慎操作)** 若需允许用户查看 `pg_namespace` 系统表(存储模式元数据): ```sql -- 将系统表查询权限授予用户 GRANT SELECT ON pg_catalog.pg_namespace TO user_name; -- 验证权限(管理员执行) SELECT has_table_privilege('user_name', 'pg_namespace', 'SELECT'); ``` #### 3. **批量授权脚本(Python 示例)** ```python import vastbase # 或 psycopg2 连接 Vastbase conn = vastbase.connect("dbname=postgres user=admin") cursor = conn.cursor() schemas = ["public", "sales", "hr"] # 需授权的模式列表 for schema in schemas: cursor.execute(f"GRANT USAGE ON SCHEMA {schema} TO analyst_role;") cursor.execute(f"GRANT SELECT ON ALL TABLES IN SCHEMA {schema} TO analyst_role;") conn.commit() ``` --- ### ⚠️ 关键注意事项 1. **权限层级规则** - 模式权限 `USAGE` 是访问模式内对象的**前置条件**[^1] - 对象权限(SELECT/INSERT 等)需**单独授予** ```mermaid graph LR A[用户] --> B[数据库CONNECT权限] B --> C[模式USAGE权限] C --> D[表SELECT权限] ``` 2. **系统表风险** 直接操作 `pg_namespace` 可能导致: - 系统目录损坏引发数据库崩溃 - 权限信息与其他系统视图(如 `information_schema.schemata`)不一致 - 安全漏洞(暴露敏感元数据) 3. **Vastbase 特性** - 企业版支持 `GRANT ON ALL SCHEMAS` 语法(需确认版本) - 安全增强模式下可能限制系统表访问 --- ### 🔍 权限验证命令 ```sql -- 查看用户拥有的模式权限 SELECT nspname, nspacl FROM pg_namespace WHERE has_schema_privilege('user_name', nspname, 'USAGE'); -- 检查系统表权限 SELECT * FROM pg_catalog.pg_privileges WHERE relname = 'pg_namespace' AND grantee = 'user_name'; ``` --- ### 📚 最佳实践建议 1. **最小权限原则** 仅授予必要权限,例如只读用户只需: ```sql GRANT USAGE ON SCHEMA public TO reader; GRANT SELECT ON ALL TABLES IN SCHEMA public TO reader; ``` 2. **角色继承管理** ```sql CREATE ROLE schema_admin; GRANT CREATE, USAGE ON SCHEMA critical TO schema_admin; -- 继承给具体用户 GRANT schema_admin TO user1; ``` 3. **权限回收** ```sql REVOKE SELECT ON pg_namespace FROM user_name; REVOKE USAGE ON SCHEMA schema_name FROM user_name; ``` --- ### 相关问题 1. 如何在 Vastbase 中批量撤销多个模式权限? 2. Vastbase 与 PostgreSQL 在系统表权限管理上有哪些差异? 3. 如何审计 Vastbase 中所有用户对 `pg_namespace` 的访问权限? 4. Vastbase 的安全加固模式如何影响系统表授权? 5. 模式权限继承在复杂业务场景中如何优化管理? [^1]: Vastbase 官方文档明确指出:模式 `USAGE` 权限是访问其内部对象的必要前提,直接操作系统表可能导致不可恢复的错误。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值