GaussDB 创建、修改和删除Schema介绍

chema又称作模式。通过管理Schema,允许多个用户使用同一数据库而不相互干扰,可以将数据库对象组织成易于管理的逻辑组,同时便于将第三方应用添加到相应的Schema下而不引起冲突。

每个数据库包含一个或多个Schema。数据库中的每个Schema包含表和其他类型的对象。数据库创建初始,默认具有一个名为public的公共Schema,所有用户都拥有此Schema的usage权限。此外,每个数据库都包含一个pg_catalog Schema,它包含系统表和所有内置数据类型、函数和操作符。只有系统管理员和初始化用户可以在public和pg_catalog Schema下创建函数、存储过程和同义词对象,其他用户即使授予public和pg_catalog模式的create权限后也不可以创建上述三种对象。可以通过Schema分组数据库对象。Schema类似于操作系统目录,但Schema不能嵌套。默认只有初始化用户可以在pg_catalog模式下创建对象。

相同的数据库对象名称可以应用在同一数据库的不同Schema中,而没有冲突。例如,a_schema和b_schema都可以包含名为mytable的表。具有所需权限的用户可以访问数据库的多个Schema中的对象。

通过CREATE USER创建用户的同时,系统会在执行该命令的数据库中,为该用户创建一个同名的Schema。

数据库对象创建在数据库搜索路径中的第一个Schema内。默认情况下的第一个Schema及如何变更Schema顺序等更多信息,请参见搜索路径

创建、修改和删除Schema
  • 创建Schema,请参见CREATE SCHEMA。默认初始用户和系统管理员可以创建Schema,其他用户需要具备数据库的CREATE权限才可以在该数据库中创建Schema,赋权方式请参见GRANT中将数据库的访问权限赋予指定的用户或角色中的语法。
  • 更改Schema名称或者所有者,请参见ALTER SCHEMA。Schema所有者可以更改Schema。
  • 删除Schema及其对象,请参见DROP SCHEMA。Schema所有者可以删除Schema。
  • 在Schema内创建表,请以schema_name.table_name格式创建表。不指定schema_name时,对象默认创建到搜索路径中的第一个Schema内。
  • 查看Schema所有者,请对系统表PG_NAMESPACE和系统视图GS_USER执行如下关联查询。语句中的schema_name请替换为实际要查找的Schema名称。
    gaussdb=# SELECT s.nspname,u.usename AS nspowner FROM pg_namespace s, gs_user u WHERE nspname='schema_name' AND s.nspowner = u.usesysid;
    
  • 查看所有Schema的列表,请查询PG_NAMESPACE系统表。
    gaussdb=# SELECT * FROM pg_namespace;
    
  • 查看属于某Schema下的表列表,请查询系统视图PG_TABLES。例如,以下查询会返回Schema PG_CATALOG中的表列表。
    gaussdb=# SELECT distinct(tablename),schemaname from pg_tables where schemaname = 'pg_catalog';
    
搜索路径

搜索路径定义在GUC参数search_path中,参数取值形式为采用逗号分隔的Schema名称列表。如果创建对象时未指定目标Schema,则该对象将会被添加到搜索路径中列出的第一个Schema中。当不同Schema中存在同名的对象时,查询对象未指定Schema的情况下,将从搜索路径中包含该对象的第一个Schema中返回对象。

  • 要查看当前搜索路径,请使用SHOW
    gaussdb=# SHOW SEARCH_PATH;
     search_path
    ----------------
     "$user",public
    (1 row)
    

    search_path参数的默认值为:"$user",public。$user表示与当前会话用户名同名的Schema名,如果这样的模式不存在,$user将被忽略。所以默认情况下,用户连接数据库后,如果数据库下存在同名Schema,则对象会添加到同名Schema下,否则对象被添加到Public Schema下。

  • 更改当前会话的默认Schema,请使用SET命令。执行如下命令将搜索路径设置为myschema, public,首先搜索myschema,然后搜索public。
    gaussdb=# SET SEARCH_PATH TO myschema, public;
    SET

更多详情请参考GaussDB 文档中心:https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/24.1.30/productdesc/qlh_03_0001.html

### 删除数据库视图的方法 要删除名为 `MyView` 的数据库视图,可以使用 SQL 中的 `DROP VIEW` 语句。此操作会永久移除该视图及其定义,因此在执行之前应确保不再需要依赖于该视图的数据或逻辑。 以下是具体的 SQL 语法用于删除视图: ```sql DROP VIEW IF EXISTS MyView; ``` 这条命令的作用是如果存在名为 `MyView` 的视图,则将其删除;如果不存在也不会报错[^1]。 为了验证视图是否成功被删除,可以在删除之后尝试查询该视图,并确认抛出错误提示表明其已不存在。例如运行如下查询语句: ```sql SELECT * FROM MyView; ``` 当试图访问已被删除的视图时,应该收到类似于 “Table/View 'MYVIEW' does not exist”的错误消息[^2]。 另外,在某些情况下可能还需要重新创建新的视图或者调整应用程序内的其他部分以适应这种变更。比如按照先前提到的方式再次建立一个新的视图实例: ```sql CREATE VIEW MyNewView AS SELECT name, home_state FROM Sample.Person; ``` 以上展示了基本的操作流程,包括如何安全地移除旧有视图而不影响整个系统的稳定性,同时也提供了简单的示例来说明后续步骤之一可能是构建替代方案[^3]。 ### 编程与测试需求分析 对于涉及此类数据库对象管理的任务来说,良好的实践通常包含以下几个方面: - **权限控制**:确保当前用户具有足够的权限来进行这些更改。 - **事务处理**:考虑将多个相关联的动作包裹在一个事务里以便要么全部完成要么完全回滚。 - **日志记录**:保持详细的活动历史有助于追踪任何意外发生的情况。 下面给出一段伪代码片段展示了一个较为完整的场景下如何实施上述策略的一个例子: ```python try: connection = establish_database_connection() cursor = connection.cursor() # 开始事务 begin_transaction(cursor) # 执行删除视图操作 drop_view_query = "DROP VIEW IF EXISTS MyView;" execute_sql(cursor, drop_view_query) # 可选: 创建新视图或其他补偿措施 create_new_view_query = """ CREATE VIEW MyNewView AS SELECT name, home_state FROM Sample.Person; """ execute_sql(cursor, create_new_view_query) # 提交事务 commit_transaction(connection) except Exception as e: rollback_transaction(connection) log_error(e) finally: close_cursor_and_connection(cursor, connection) ``` 这里假设了一些辅助函数的存在如 `establish_database_connection`, `begin_transaction`, etc., 它们负责具体连接管理异常恢复等功能[^4]。 #### 注意事项 - 在生产环境中务必小心谨慎对待 DDL(Data Definition Language) 命令因为它们直接影响到数据结构本身。 - 测试阶段应当充分考虑到各种边界情况从而保证改动不会引入不可预见的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值