GaussDB数据库表创建行访问控制策略

本文详细介绍了GaussDB中行访问控制的实现,包括CREATEROWLEVELSECURITYPOLICY和ALTERROWLEVELSECURITYPOLICY的语法,以及如何创建和修改策略以保护数据安全。通过示例展示了如何应用这些策略来限制用户对数据的访问权限。

目录

一、前言

二、GaussDB中的行访问控制

1、CREATE ROW LEVEL SECURITY POLICY语法

2、ALTER ROW LEVEL SECURITY POLICY语法

3、ROW LEVEL SECURITY策略与适配SQL语法关系

三、GaussDB中的行访问控制策略示例

1、实现GaussDB行访问控制的一般步骤

2、行访问控制策略的创建与修改(示例)

1)创建行访问控制策略,实现“学生自己只能查看自己的课程成绩”

2)修改行访问策略,实现“学生只能在8:00-18:00查看自己的成绩”

四、注意事项

五、小结

一、前言

数据的安全性和隐私性变得越来越重要。行访问控制策略是数据库管理中的一种重要技术,可以保护数据的机密性和完整性。GaussDB是一款高性能、高可用性的数据库管理系统,提供了丰富的安全功能,其中包括行访问控制策略。

本文将介绍GaussDB数据库表创建行访问控制策略的基本概念和操作方法,并通过实例演示其过程。通过介绍,读者可以了解GaussDB数据库表创建行访问控制策略的重要性和具体实现方法,为保障数据安全提供参考。

二、GaussDB中的行访问控制

一般默认情况下,表是没有行级安全策略限制的,要想使表具有行级安全性,要么在初始时就通过“CREATE ROW LEVEL SECURITY POLICY”创建、要么就在后期通过“ALTER ROW LEVEL SECURITY POLICY”修改。

在GaussDB中,行访问控制影响数据表的读取操作(例如:SELECT、UPDATE、DELETE等),暂不影响数据表的写入操作(例如:INSERT、MERGE INTO等)。

1CREATE ROW LEVEL SECURITY POLICY语法

对表创建行访问控制策略。

1)语法:

CREATE [ ROW LEVEL SECURITY ] POLICY policy_name ON table_name
     [ AS { PERMISSIVE | RESTRICTIVE } ]
     [ FOR { ALL | SELECT | UPDATE | DELETE } ]
     [ TO { role_name | PUBLIC | CURRENT_USER | SESSION_USER } [, ...] ]
     USING ( using_expression )

2)参数:

  • policy_name行访问控制策略名称,同一个数据表上行访问控制策略名称不能相同。
  • table_name行访问控制策略的表名。
  • PERMISSIVE指定行访问控制策略为宽容性策略,条件用OR表达式拼接。
  • RESTRICTIVE指定行访问控制策略为限制性策略,条件用AND表达式拼接。
  • role_name行访问控制影响的数据库用户。(主要包含:CURRENT_USER、SESSION_USER等。当未指定时,默认为PUBLIC,表示影响所有数据库用户。可以指定多个受影响的数据库用户。系统管理员不受行访问控制特性影响)
  • using_expression行访问控制的表达式(返回boolean值)。

2、ALTER ROW LEVEL SECURITY POLICY语法

对已存在的行访问控制策略(包括行访问控制策略的名称,行访问控制指定的用户,行访问控制的策略表达式)进行修改。

1)语法:

--修改已存在行访问控制策略的名称
ALTER [ ROW LEVEL SECURITY ] POLICY policy_name ON table_name RENAME TO new_policy_name;

--修改已存在行访问控制策略的指定用户、策略表达式
ALTER [ ROW LEVEL SECURITY ] POLICY policy_name ON table_name
    [ TO { role_name | PUBLIC } [, ...] ]
    [ USING ( using_expression ) ];

2)参数:

  • policy_name行访问控制策略名称
  • table_name行访问控制策略的表名。
  • new_policy_name新的行访问控制策略名称。
  • role_name行访问控制策略应用的数据库用户,可以指定多个用户,PUBLIC表示应用到所有用户。
  • using_expression行访问控制策略,形式类似于where子句中的布尔型表达式。

3、ROW LEVEL SECURITY策略与适配SQL语法关系

Command

SELECT/ALL policy

UPDATE/ALL policy

DELETE/ALL policy

SELECT

Existing row

No

No

SELECT FOR UPDATE/SHARE

Existing row

Existing row

No

UPDATE

No

Existing row

No

UPDATE RETURNING

Existing row

Existing row

No

DELETE

No

No

Existing row

DELETE RETURNING

Existing row

No

Existing row

三、GaussDB中的行访问控制策略示例

1、实现GaussDB行访问控制的一般步骤

在GaussDB中,行访问控制是数据库安全的重要组成部分。通过启用行级访问控制,可以限制数据库中的用户对特定数据的访问权限。以下是实现GaussDB行访问控制的一般步骤。

请注意,具体实现方法可能因GaussDB版本和配置环境而有所不同。因此,在实际操作中,建议参考GaussDB官方文档。

2、行访问控制策略的创建与修改(示例)

1)创建行访问控制策略,实现“学生自己只能查看自己的课程成绩”。

--创建用户zhangsan、lisi (Password must contain at least three kinds of characters)
CREATE USER zhangsan PASSWORD 'zhangsan@123';
CREATE USER lisi PASSWORD 'lisi@123';


--创建数据表test_3。
CREATE TABLE test_3(
   id int
  ,name varchar(20)
  ,course varchar(20)
  ,score int 
);

--向数据表插入数据
INSERT INTO test_3 VALUES(1, 'zhangsan', '语文',90);
INSERT INTO test_3 VALUES(2, 'zhangsan', '数学',95);
INSERT INTO test_3 VALUES(3, 'zhangsan', '英语',85);
INSERT INTO test_3 VALUES(4, 'lisi', '语文',85);
INSERT INTO test_3 VALUES(5, 'lisi', '数学',90);
INSERT INTO test_3 VALUES(6, 'lisi', '英语',95);

--将表test_3的读取权限赋予zhangsan、lisi。
GRANT SELECT ON test_3 TO zhangsan,lisi;

--打开行访问控制策略开关。
ALTER TABLE test_3 ENABLE ROW LEVEL SECURITY;

--创建行访问控制策略,当前用户只能查看用户自己的数据。
CREATE ROW LEVEL SECURITY POLICY test_3_r 
ON test_3 
USING(name = CURRENT_USER);
--查看表test_3相关信息。通过元命令 “\d+  test_3”  或者通过系统表“PG_RLSPOLICY”
GaussDB=# \d+ test_3
                               Table "public.test_3"
 Column |         Type          | Modifiers | Storage  | Stats target | Description 
--------+-----------------------+-----------+----------+--------------+-------------
 id     | integer               |           | plain    |              | 
 name   | character varying(20) |           | extended |              | 
 course | character varying(20) |           | extended |              | 
 score  | integer               |           | plain    |              | 
Row Level Security Policies:
    POLICY "test_3_r" FOR ALL
      TO public
      USING (((name)::name = "current_user"()))
Has OIDs: no
Options: orientation=row, compression=no, enable_rowsecurity=true

--切换用户zhangsan进行SELECT操作
[omm@node1 root]$ gsql -d postgres -U zhangsan -p 26000 -ar

GaussDB=> SELECT * FROM test_3;
 id |   name   | course | score 
----+----------+--------+-------
  1 | zhangsan | 语文   |    90
  2 | zhangsan | 数学   |    95
  3 | zhangsan | 英语   |    85
(3 rows)

--切换用户lisi进行SELECT操作
[omm@node1 root]$ gsql -d postgres -U lisi -p 26000 -ar

GaussDB=> SELECT * FROM test_3;
 id | name | course | score 
----+------+--------+-------
  4 | lisi | 语文   |    85
  5 | lisi | 数学   |    90
  6 | lisi | 英语   |    95
(3 rows)

2)修改行访问策略,实现“学生只能在8:00-18:00查看自己的成绩”

ALTER ROW LEVEL SECURITY POLICY test_3_r
ON test_3 
USING (name = CURRENT_USER AND current_time >= TIME '08:00:00' AND current_time <= TIME '18:00:00');

--查看表test_3相关信息。通过元命令 “\d+  test_3”  或者通过系统表“PG_RLSPOLICY”

GaussDB=# \d+ test_3
                               Table "public.test_3"
 Column |         Type          | Modifiers | Storage  | Stats target | Description 
--------+-----------------------+-----------+----------+--------------+-------------
 id     | integer               |           | plain    |              | 
 name   | character varying(20) |           | extended |              | 
 course | character varying(20) |           | extended |              | 
 score  | integer               |           | plain    |              | 
Row Level Security Policies:
    POLICY "test_3_r" FOR ALL
      TO public
      USING (((((name)::name = "current_user"()) AND (('now'::text)::time with time zone >= ('08:00:00'::time without time zone)::time with time zone)) AND (('now'::text)::time with time zone <= ('18:00:00'::time without time zone)::time with time zone)))
Has OIDs: no
Options: orientation=row, compression=no, enable_rowsecurity=true

四、注意事项

  • 不支持外表、本地临时表、视图定义行访问控制策略。
  • 同一张表可以创建多个行访问控制策略。
  • 系统管理员不受行访问控制影响。
  • 不支持对添加了行级访问控制策略的表字段进行修改数据类型操作。
  • 行访问控制策略可以应用到指定的操作(SELECT、UPDATE、DELETE、ALL),ALL表示会影响SELECT、UPDATE、DELETE三种操作,默认为ALL。
  • 需要打开该表的行访问控制开关(ALTER TABLE ... ENABLE ROW LEVEL SECURITY),否则不生效。
  • 行访问控制策略名称是针对表的,同一个数据表上不能有同名的行访问控制策略;对不同的数据表,可以有同名的行访问控制策略。

五、小结

通过本文的介绍,读者可以了解到GaussDB数据库表创建行访问控制策略的重要性和具体实现方法。行访问控制策略是一种有效的数据保护技术,可以防止未经授权的访问和恶意攻击,提高数据的安全性和可靠性。 在实际应用中,根据不同的业务需求和安全要求,可以灵活运用GaussDB提供的行访问控制策略功能,制定相应的安全策略,以保障数据的安全性和隐私性。

——结束

<think>嗯,用户询问GaussDB创建数据库创建空间的关系。这个问题需要结合数据库的基础概念和GaussDB的特性来解释。 首先需要明确几个关键概念:在GaussDB中,数据库是逻辑上的数据容器,包含、索引等对象;而空间是物理存储位置,用于管理磁盘空间。两者关系类似仓库和货架——数据库是仓库,空间是里面的存储区域。 用户引用的材料提到空间可以跨数据库使用,这点很重要。参考引用[3]中的CREATE TABLESPACE语法,可以看到空间创建时指定了物理文件路径和存储参数,这说明空间本质是物理存储单元。而引用[1]提到数据库包含空间,数据库作为逻辑容器可以包含多个空间。 权限管理方面,空间需要独立授权。引用[3]的WITH子句展示了空间的高级配置,如压缩、分区策略等,这些特性会影响数据库性能但独立于数据库定义。用户可能还关心实践中的关联操作,比如创建数据库时默认空间的分配机制。 性能优化角度也很关键。引用[4]显示创建分区时需要关联空间,这说明空间直接影响数据分布策略。不同空间配置不同的存储参数(如引用[3]的列存配置),可以针对业务场景优化数据库性能。 最后需要强调依赖关系:虽然空间可独立创建,但必须关联数据库才能存储数据对象;而数据库创建时必须依赖至少一个空间。这种解耦设计既保证灵活性,又确保数据必须落地存储。</think>在GaussDB中,**创建数据库**和**创建空间**是两个密切相关但职责不同的操作,它们的关系可概括为:**空间为数据库提供物理存储空间,数据库空间服务的逻辑容器**。具体关系如下: ### 1. **职责分工** * **数据库 (`DATABASE`)**: * 是**逻辑上的数据集合**,包含、索引、视图、函数等所有数据库对象。 * 定义了数据的**逻辑边界**和**访问权限**(用户、角色)。 * 一个数据库实例下可创建多个数据库(如 `db1`, `db2`)。 * **空间 (`TABLESPACE`)**: * 是**物理存储位置**的映射,对应磁盘上的一个或多个数据文件(如 `.dbf`)。 * 管理**磁盘空间的分配策略**(如块大小、压缩、条带化)。 * **独立于数据库存在**,可被多个数据库共享使用[^1][^3]。 ### 2. **依赖关系** * **创建数据库必须指定空间**: 当执 `CREATE DATABASE` 时,必须为其指定一个**默认空间**(用于存储该数据库的系统和用户对象,除非显式指定其他空间)。 ```sql CREATE DATABASE mydb WITH TABLESPACE = ts_default; -- ts_default 是已存在的空间 ``` * **空间可先于数据库创建**: 空间是物理资源,可在创建任何数据库之前预先规划和创建(如引用[3][^3]所示),后续供数据库使用。 ### 3. **使用场景** * **隔离存储**: 为不同业务数据库(如财务库 `db_finance`、日志库 `db_log`)分配独立的空间(如 `ts_finance`, `ts_log`),实现物理存储隔离和性能管理。 * **性能优化**: 为高频访问或索引指定高性能存储的空间(如SSD盘),为归档数据指定大容量空间(如HDD盘)[^3]。 * **空间管理**: 通过监控空间使用率,独立扩展某个数据库的存储容量,无需影响其他数据库。 ### 4. **关键区别总结** | 特性 | 数据库 (`DATABASE`) | 空间 (`TABLESPACE`) | |--------------|--------------------------------------|--------------------------------------| | **本质** | 逻辑数据容器 | 物理存储单元 | | **作用** | 组织数据对象、管理权限 | 管理磁盘空间、定义存储策略 | | **创建依赖** | 必须指定空间 | 可独立创建 | | **共享性** | 对象严格隔离(默认) | 可被多个数据库共用 | | **操作目标** | 存放、索引等 | 存放数据文件 | ### 示例流程 ```sql -- 1. 先创建空间(物理存储) CREATE TABLESPACE ts_app1 DATAFILE '/gaussdb/data/ts_app1.dbf' SIZE 100GB; -- 2. 创建数据库,并关联空间 CREATE DATABASE app_db1 WITH TABLESPACE = ts_app1; -- 3. 在数据库创建时,可显式指定空间(默认为数据库的默认空间) CREATE TABLE app_db1.order_table (...) TABLESPACE ts_app1; ``` ### 结论 在GaussDB中,**空间是数据库的物理存储基础**。创建数据库时**必须绑定至少一个空间**作为其存储位置,而空间作为独立的物理资源池,可被多个数据库灵活共享。这种设计实现了**逻辑数据管理与物理存储资源的解耦**,为数据库的存储规划、性能调优和容量扩展提供了更大灵活性[^1][^3][^4]。 --- ###
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gauss松鼠会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值