
# 数据库对象
数据库对象是数据库逻辑结构的集合，常见的数据库对象有：表、视图、索引、序列、存储过程、包、用户等。
#### 数据库
数据库用于管理各类数据对象，与其他数据库隔离。创建数据对象时可以指定对应的表空间，如果不指定相应的表空间，相关的对象会默认保存在PG_DEFAULT空间中。数据库管理的对象可分布在多个表空间上。
#### 表空间
在GaussDB中，表空间是一个目录，实例中可以存在多个表空间，里面存储的是它所包含的数据库的各种物理文件。由于表空间是一个目录，仅起到了物理隔离的作用，其管理功能依赖于文件系统。
#### 表
表是一系列二维数组的集合，是数据组织的基础单元，由行（row）和列（column）构成。列又称为字段名。数据库表中的一行数据称为一条记录，多数是由同类信息组成。
- 表分为普通表和临时表。
  - 临时表的生命周期仅存在于会话期间，会话断开后会自动删除临时表。
  
  - 临时表可以和普通表重名。当同时存在同名的临时表和普通表时，查看表结构、DML等操作都作用于临时表。
   
- 列 列用于记录表上某个属性的值，用户给每个属性定义的名称称为列名。除了列名以外，还有数据类型以及数据类型最大长度（精度）等信息。
  
- 行 行表示表中单条记录中所有列的集合。表中每行代表一组相关数据，且每行都具有相同的结构。
  
 
#### 视图
视图是一个虚拟表，其本身不存储数据。本质上视图是一个预定义的查询语句，用户可以通过访问视图来检索数据。在SELECT语句中涉及到的表称为基表，当基表数据发生变化，视图也会随之变化。删除视图不会对基表产生影响。
- 优点
  - 简单性：视图可以简化用户对数据的理解和操作。常用的查询可以定义为视图，用户无需每次都指定全部条件。
  
  - 安全性：通过视图，用户只能访问其可见的数据，表中其他列对用户不可见，从而实现更细粒度的权限控制。
   
- 缺点
  - 性能问题：尽量避免在视图中使用视图（嵌套视图），因为这可能会使查询的性能下降。
  
  - 维护的复杂性：需要考虑修改了基表表结构后视图是否可用。
   
 
#### 索引
索引是一种数据结构，包含着对数据表中所有记录的引用指针，类似于书籍的目录，用于加快数据库查询速度和性能。
- 优点
  - 加快查询速度，降低数据库的I/O成本。
  
  - 降低数据库的排序成本，可以减少分组和排序的时间。
  
  - 通过唯一索引，可以保证表中数据的唯一性。
   
- 缺点
  - 索引需要占用额外的存储空间。
  
  - 在插入和修改数据时，需要花费更多时间。
   
 
- 索引的可用性和可见性
  - 索引可用性 在删除分区场景，如果没有指定需要重建索引字段，会将索引标记为UNUSABLE（即不可用状态）。在DML操作中，索引无需维护，并且优化器会忽略该索引。
    
  
  - 索引可见性 索引的可见性指的是优化器是否忽略该索引。如果索引不可见，优化器会忽略它，但在DML操作中，索引仍需维护。通常，在删除索引之前，可以先将索引设置为不可见状态，以观察对业务的影响。确认无影响后，再删除索引。
    
   
 
#### 用户和角色
- 用户（USER）是数据库的访问主体，每个用户都有自己的用户名和密码。用户可以执行数据库操作，而用户的权限通常来源于分配给用户的角色。
  - 初始用户： 集群安装过程中自动生成的账户称为初始用户。初始用户也是系统管理员、安全管理员、审计管理员、监控管理员、运维管理员和安全策略管理员，拥有系统的最高权限，能够执行所有的操作。如果安装时不设置初始用户名称，则该账户与进行集群安装的操作系统用户同名。如果在安装集群时不设置初始用户的密码，安装完成后密码为空，在执行其他操作前需要通过gsql客户端修改初始用户的密码。如果初始用户密码为空，则除修改密码外，无法执行其他SQL操作以及升级、扩容、节点替换等操作。
    ![](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
    - 初始用户的OID为10，可以通过gs_roles视图查询。
    
    - 初始用户会绕过所有权限检查。建议仅将初始用户作为DBA管理用途，而非业务应用。
      
  
  - 系统管理员（SYSADMIN）： 系统管理员是指具有SYSADMIN属性的账户，默认安装情况下具有与对象所有者相同的权限，但不包括dbe_perf模式的对象权限。
    要创建新的系统管理员，请以初始用户或者系统管理员用户身份连接数据库，并使用带SYSADMIN选项的[CREATE USER](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0575.html#ZH-CN_TOPIC_0000002559105917)语句或[ALTER USER](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0516.html#ZH-CN_TOPIC_0000002558945995)语句进行设置。
    ```
    --创建时指定该用户为系统管理员。
    gaussdb=# CREATE USER u1 WITH SYSADMIN PASSWORD '********';
    --创建用户后使用ALTER语句指定该用户为系统管理员。
    gaussdb=# CREATE USER u2 PASSWORD '********';
    gaussdb=# ALTER USER u2 SYSADMIN;
    --删除。
    gaussdb=# DROP USER u1;
    gaussdb=# DROP USER u2;
    ```
    
  
  - 安全管理员（CREATEROLE）： 安全管理员是指具有CREATEROLE属性的账户，具有创建、修改、删除用户或角色的权限，和授予或者撤销任何非系统管理员、内置角色、永久用户、运维管理员的权限。
    要创建新的安全管理员，三权分立关闭时，请以系统管理员或者安全管理员身份连接数据库。三权分立打开时，请以安全管理员身份连接数据库，并使用带CREATEROLE选项的[CREATE USER](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0575.html#ZH-CN_TOPIC_0000002559105917)语句或[ALTER USER](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0516.html#ZH-CN_TOPIC_0000002558945995)语句进行设置。
    ```
    --创建用户时指定用户为安全管理员。
    gaussdb=# CREATE USER u1 WITH CREATEROLE PASSWORD '********'; 
    --创建用户后使用ALTER语句指定该用户为安全管理员。
    gaussdb=# CREATE USER u2 PASSWORD '********';
    gaussdb=# ALTER USER u2 CREATEROLE;
    --删除。
    gaussdb=# DROP USER u1;
    gaussdb=# DROP USER u2;
    ```
    
  
  - 审计管理员（AUDITADMIN）： 审计管理员是指具有AUDITADMIN属性的账户，具有查看和删除审计日志的权限。
    要创建新的审计管理员，三权分立关闭时，请以系统管理员或者安全管理员身份连接数据库。三权分立打开时，只能以初始用户身份连接数据库，并使用带AUDITADMIN选项的[CREATE USER](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0575.html#ZH-CN_TOPIC_0000002559105917)语句或[ALTER USER](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0516.html#ZH-CN_TOPIC_0000002558945995)语句进行设置。
    ```
    --创建时指定该用户为审计管理员。
    gaussdb=# CREATE USER u1 WITH CREATEROLE password '********';
    --创建用户后使用ALTER语句指定该用户为审计管理员。
    gaussdb=# CREATE USER u2 PASSWORD '********';
    gaussdb=# ALTER USER u2 CREATEROLE;
    --删除。
    gaussdb=# DROP USER u1;
    gaussdb=# DROP USER u2;
    ```
    
  
  - 监控管理员（MONADMIN） 监控管理员是指具有MONADMIN属性的账户，具有查看dbe_perf模式下视图和函数的权限，亦可以对dbe_perf模式的对象权限进行授予或收回。
    要创建新的监控管理员，请以系统管理员身份连接数据库，并使用带MONADMIN选项的[CREATE USER](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0575.html#ZH-CN_TOPIC_0000002559105917)语句或[ALTER USER](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0516.html#ZH-CN_TOPIC_0000002558945995)语句进行设置。
    ```
    --创建时指定该用户为监控管理员。
    gaussdb=# CREATE USER u1 WITH MONADMIN password '********';
    --创建用户后使用ALTER语句指定该用户为监控管理员。
    gaussdb=# CREATE USER u2 PASSWORD '********';
    gaussdb=# ALTER USER u2 MONADMIN;
    --删除。
    gaussdb=# DROP USER u1;
    gaussdb=# DROP USER u2;
    ```
    
  
  - 运维管理员（OPRADMIN） 运维管理员是指具有OPRADMIN属性的账户，具有使用Roach工具执行备份恢复的权限。
    要创建新的运维管理员，请以初始用户身份连接数据库，并使用带OPRADMIN选项的[CREATE USER](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0575.html#ZH-CN_TOPIC_0000002559105917)语句或 [ALTER USER](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0516.html#ZH-CN_TOPIC_0000002558945995)语句进行设置。
    ```
    --创建时指定该用户为运维管理员。
    gaussdb=# CREATE USER u1 WITH OPRADMIN password '********';
    --创建用户后使用ALTER语句指定该用户为运维管理员。
    gaussdb=# CREATE USER u2 PASSWORD '********';
    gaussdb=# ALTER USER u2 OPRADMIN;
    --删除。
    gaussdb=# DROP USER u1;
    gaussdb=# DROP USER u2;
    ```
    
  
  - 安全策略管理员（POLADMIN） 安全策略管理员是指具有POLADMIN属性的账户，具有创建资源标签、脱敏策略和统一审计策略的权限。
    要创建新的安全策略管理员，请以系统管理员用户身份连接数据库，并使用带POLADMIN选项的[CREATE USER](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0575.html#ZH-CN_TOPIC_0000002559105917)语句或 [ALTER USER](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0516.html#ZH-CN_TOPIC_0000002558945995)语句进行设置。
    ```
    --创建时指定该用户为安全策略管理员。
    gaussdb=# CREATE USER u1 WITH POLADMIN password '********';
    --创建用户后使用ALTER语句指定该用户为安全策略管理员。
    gaussdb=# CREATE USER u2 PASSWORD '********';
    gaussdb=# ALTER USER u2 POLADMIN;
    --删除。
    gaussdb=# DROP USER u1;
    gaussdb=# DROP USER u2;
    ```
    
  
  - 普通用户：这些用户通常被赋予执行特定业务操作所需的权限。普通用户的创建可以通过CREATE USER语句，并且可以指定密码、有效时间、连接限制等。
    ```
    --创建用户u1。
    gaussdb=# CREATE USER u1 PASSWORD '********';
    --删除。
    gaussdb=# DROP USER u1;
    ```
    
   
- 角色（ROLE）是一组权限的集合，用于组织和管理权限。通过将角色授予给用户，使用户继承角色的所有权限。角色之间的权限可以继承。
  - public角色：GaussDB提供了一个隐式定义的角色public，所有创建的用户和角色默认属于public角色。可以通过GRANT和REVOKE语句来修改PUBLIC的权限。
  
  - 内置角色：GaussDB提供了一组默认角色，以gs_role_开头命名，这些角色提供了对特定高权限操作的访问。例如，gs_role_signal_backend角色允许调用函数来取消或终止其他会话，而gs_role_tablespace角色允许创建表空间。
   
- 用户与角色的关系：用户的权限来自于角色。用户可以看作是具有登录权限的角色，而角色可以看作是没有登录权限的用户。通过角色，可以更方便地管理和分配权限，尤其是在有多个用户需要相同权限的情况下。通过这些机制，GaussDB实现了灵活且安全的权限管理，使得数据库管理员可以根据业务需求和安全性要求，合理地分配和管理用户权限。
  ```
  --创建角色r1。
  gaussdb=# CREATE ROLE r1 PASSWORD '********';
  --创建用户u1。
  gaussdb=# CREATE USER u1 PASSWORD '********';
  --将角色r1权限赋予u1。
  gaussdb=# GRANT r1 TO u1;
  --查询上述的角色和用户信息。
  gaussdb=# \du r1|u1;
              List of roles
   Role name |  Attributes  | Member of 
  -----------+--------------+-----------
   r1        | Cannot login | {}
   u1        |              | {r1}
  --删除用户和角色。
  gaussdb=# DROP USER u1;
  gaussdb=# DROP ROLE r1;
  ```
  
 
