更新时间:2025-09-19 GMT+08:00
分享

模式(Schema)

简介

模式(Schema)是数据库的对象之一,用于组织数据库中的表、视图、索引、函数和操作符等对象,其作用如下:

  • 逻辑隔离:将数据库对象组织成易于管理的逻辑组,不同的模式可以包含同名的对象而不冲突。
  • 权限控制:通过模式可以更细粒度地控制用户对数据库的访问权限。可以在模式级别授予或撤销权限,确保数据的安全性和隔离性。
  • 便于管理:模式使得数据库对象管理更加方便灵活,特别是在多应用、多用户的环境中。

创建和管理模式

如下仅介绍一些常用的语法,详情见CREATE SCHEMAALTER SCHEMADROP SCHEMA

  • 创建Schema
    gaussdb=# CREATE SCHEMA sch1 ;
    CREATE SCHEMA
    
    --查看Schema信息。
    gaussdb=# \dn sch1
    List of schemas
     Name | Owner 
    ------+-------
     sch1 | omm
    (1 row)
  • 修改Schema
    --前置操作,创建用户。
    gaussdb=# CREATE USER u1 PASSWORD '********';
    CREATE ROLE
    
    --修改模式的名称。
    gaussdb=# ALTER SCHEMA sch1 RENAME TO sch2;
    ALTER SCHEMA
    
    --修改模式的拥有者。
    gaussdb=# ALTER SCHEMA sch2 OWNER TO u1;
    ALTER SCHEMA
    
    --查看Schema信息。
    gaussdb=# \dn sch*
    List of schemas
     Name | Owner 
    ------+-------
     sch2 | u1
    (1 row)
  • 删除Schema
    gaussdb=# DROP SCHEMA sch2;
    DROP SCHEMA
    
    --删除用户。
    gaussdb=# DROP USER u1;
    DROP ROLE

搜索路径

搜索路径用于确定在解析数据库对象名称时,数据库将按照什么顺序去对应的模式下查找。搜索路径的设置可以影响SQL查询的解析和执行。当用户使用一个对象(表、视图、索引、函数等)而没有指定Schema时,数据库会按照搜索路径中定义的顺序依次查找,直到找到该对象时结束。

  • 查询搜索路径。
    如下示例中查询结果:在没有指定模式名的情况下,数据库在查找对象时首先在与用户名同名的模式下查找,然后再去public模式下查找。
    --查询当前搜索路径。
    gaussdb=# SHOW search_path;
      search_path   
    ----------------
     "$user",public
    (1 row)
  • 设置搜索路径。
    • 搜索路径的设置只在当前会话中生效,不会影响到其他会话。
    • 创建对象时,如果没有指定Schema,对象将默认创建在搜索路径中第一个Schema中。
    --创建模式。
    gaussdb=# CREATE SCHEMA sch1;
    CREATE SCHEMA
    gaussdb=# CREATE SCHEMA sch2;
    CREATE SCHEMA
    
    --分别在两个模式下创建名称相同的表并插入数据。
    gaussdb=# CREATE TABLE sch1.tb_test(c1 int);
    CREATE TABLE
    gaussdb=# INSERT INTO sch1.tb_test VALUES (1);
    INSERT 0 1
    gaussdb=# CREATE TABLE sch2.tb_test(c1 int);
    CREATE TABLE
    gaussdb=# INSERT INTO sch2.tb_test VALUES (2);
    INSERT 0 1
    
    --设置搜索路径sch1顺序在前查看表数据。
    gaussdb=# SET search_path = sch1,sch2,public;
    SET
    gaussdb=# SELECT * FROM tb_test;
     c1 
    ----
      1
    (1 row)
    
    
    --设置搜索路径sch2顺序在前查看表数据。
    gaussdb=# SET search_path = sch2,sch1,public;
    SET
    gaussdb=# SELECT * FROM tb_test;
     c1 
    ----
      2
    (1 row)
    
    --重置search_path并删除模式和表。
    gaussdb=# RESET search_path;
    RESET
    gaussdb=# DROP TABLE sch1.tb_test;
    DROP TABLE
    gaussdb=# DROP TABLE sch2.tb_test;
    DROP TABLE
    gaussdb=# DROP SCHEMA sch1;
    DROP SCHEMA
    gaussdb=# DROP SCHEMA sch2;
    DROP SCHEMA

相关文档