
StarRocks SHOW CREATE VIEW 详解查询与重建视图定义的最佳实践【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocksSHOW CREATE VIEW 是 StarRocks 中用于查看指定视图创建语句DDL的实用命令它返回视图完整的定义信息为视图的审计、修改、迁移和重建提供权威参考。本文以官方文档为核心结合 FE 端语法解析、权限校验与执行器源码系统讲解 SHOW CREATE VIEW 的语法、参数、返回字段、完整示例及其在 StarRocks 中的底层实现原理帮助你快速掌握该命令并理解它与 SHOW CREATE TABLE、SHOW CREATE MATERIALIZED VIEW 之间的关系。功能概述SHOW CREATE VIEW返回用于创建指定视图的 CREATE 语句。通过该语句你可以了解视图的完整定义包括视图名称、列定义、注释、安全模式SECURITY NONE/SECURITY INVOKER以及底层的 SELECT 查询为修改或重建视图提供可复制的 DDL 参考在数据字典审计、视图迁移、权限排查等场景中快速定位视图定义。权限要求执行SHOW CREATE VIEW需要具备视图本身及其依赖基表的SELECT权限。版本说明从 StarRocks v2.5.4 起SHOW CREATE VIEW还可用于查询物化视图Materialized View的创建语句。从源码实现看该能力通过在解析阶段将SHOW CREATE VIEW与SHOW CREATE MATERIALIZED VIEW统一映射到同一个语句节点ShowCreateTableStmt并在执行阶段对物化视图做兼容处理来实现详见下文源码级解析。语法SHOW CREATE VIEW [db_name.]view_name方括号[ ]表示db_name为可选项当不指定db_name时默认返回当前数据库中指定视图的 CREATE VIEW 语句。参数说明参数是否必填说明db_name否数据库名称。若不指定默认返回当前数据库中指定视图的 CREATE VIEW 语句。view_name是视图名称。返回字段说明SHOW CREATE VIEW返回一张四列的结果集结构如下------------------------------------------------------------------- | View | Create View | character_set_client | collation_connection | -------------------------------------------------------------------参数说明View视图名称。Create View该视图的 CREATE VIEW 语句。character_set_client客户端向 StarRocks 发送语句时使用的字符集。collation_connection字符集中用于比较字符的排序规则。其中character_set_client与collation_connection两列是为了兼容 MySQL 客户端的SHOW CREATE VIEW输出约定而保留的当前实现固定返回utf8与utf8_general_ci见下方源码分析。完整示例1. 创建基表先创建一个名为example_table的聚合模型表CREATE TABLE example_table ( k1 TINYINT, k2 DECIMAL(10, 2) DEFAULT 10.5, v1 CHAR(10) REPLACE, v2 INT SUM ) ENGINE olap AGGREGATE KEY(k1, k2) DISTRIBUTED BY HASH(k1);2. 基于基表创建视图基于example_table创建名为example_view的视图CREATE VIEW example_view (k1, k2, k3, v1) AS SELECT k1, k2, k3, v1 FROM example_table;3. 查看视图的创建语句SHOW CREATE VIEW example_db.example_view;返回结果如下------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | View | Create View | character_set_client | collation_connection | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | example_view | CREATE VIEW example_view (k1, k2, k3, v1) COMMENT VIEW AS SELECT default_cluster:db1.example_table.k1 AS k1, default_cluster:db1.example_table.k2 AS k2, default_cluster:db1.example_table.k3 AS k3, default_cluster:db1.example_table.v1 AS v1 FROM default_cluster:db1.example_table; | utf8 | utf8_general_ci | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------可以看到返回的Create View列中StarRocks 会自动为表名、列名加上反引号并显式补充列的别名AS子句以及带库名前缀的完整表引用如default_cluster:db1.example_table保证该语句可直接用于重建视图。这一点与 FE 端 DDL 生成逻辑一致详见下文源码解析。源码级解析SHOW CREATE VIEW 的完整执行链路SHOW CREATE VIEW在 StarRocks FE 端经历了语法解析 → 语句分析 → 权限校验 → 执行与结果构建四个阶段。以下按调用链逐一说明源码均位于 fe 目录下。1. 语法解析与 TABLE / MATERIALIZED VIEW 共用一条语法规则在 ANTLR 语法文件中StarRocks.g4SHOW CREATE被定义为一条统一的规则showCreateTableStatement : SHOW CREATE (TABLE | VIEW | MATERIALIZED VIEW) tablequalifiedName ;也就是说SHOW CREATE VIEW、SHOW CREATE TABLE、SHOW CREATE MATERIALIZED VIEW共享同一个语法入口区别仅在于关键字。在 AstBuilder.java 中解析器根据关键字将语句映射为不同的类型if (context.MATERIALIZED() ! null context.VIEW() ! null) { return new ShowCreateTableStmt(tableRef, ShowCreateTableStmt.CreateTableType.MATERIALIZED_VIEW, pos); } if (context.VIEW() ! null) { return new ShowCreateTableStmt(tableRef, ShowCreateTableStmt.CreateTableType.VIEW, pos); } return new ShowCreateTableStmt(tableRef, ShowCreateTableStmt.CreateTableType.TABLE, pos);语句节点本身统一为ShowCreateTableStmt见 ShowCreateTableStmt.java其中CreateTableType枚举定义了TABLE、VIEW、MATERIALIZED_VIEW三种类型SHOW CREATE VIEW对应的即为VIEW类型。2. 语句分析表引用规范化在 ShowStmtAnalyzer.java 中分析器会对语句中的表引用做规范化处理补齐默认 catalog、当前数据库等上下文信息public Void visitShowCreateTableStatement(ShowCreateTableStmt node, ConnectContext context) { if (node.getTableRef() null) { ErrorReport.reportSemanticException(ErrorCode.ERR_NO_TABLES_USED); } node.setTableRef(AnalyzerUtils.normalizedTableRef(node.getTableRef(), context)); return null; }这解释了为什么省略db_name时会自动定位到当前数据库中的视图。3. 权限校验对视图对象执行权限检查在 AuthorizerStmtVisitor.java 中SHOW CREATE类语句执行权限检查要求用户对视图表类对象拥有任意权限BasicTable basicTable GlobalStateMgr.getCurrentState().getMetadataMgr().getBasicTable( context, tableRef.getCatalogName(), tableRef.getDbName(), tableRef.getTableName()); Authorizer.checkAnyActionOnTableLikeObject(context, tableRef.getDbName(), basicTable);当权限不足时会抛出AccessDeniedException并报告拒绝访问信息。需要注意文档中特别强调该命令要求具备视图及基表的SELECT权限与源码中的checkAnyActionOnTableLikeObject检查机制相互印证。4. 执行与结果构建按对象类型分流输出执行逻辑位于 ShowExecutor.java。执行器根据表的实际类型普通视图View、物化视图MaterializedView、普通表走不同的结果分支普通视图返回四列结果View、Create View、character_set_client、collation_connection其中字符集与排序规则两列固定填充utf8与utf8_general_ci用于兼容 MySQL 客户端协议rows.add(Lists.newArrayList(table.getName(), createTableStmt.get(0), utf8, utf8_general_ci));物化视图当以SHOW CREATE VIEW查询物化视图时为了兼容 BI 工具会按 MySQL 标准语法拼装一条CREATE VIEW ... AS view define sql返回同上文提到的 v2.5.4 起支持物化视图而以SHOW CREATE MATERIALIZED VIEW查询时则返回专门的Materialized View/Create Materialized View两列结果。其他对象类型不匹配时会抛出ERR_WRONG_OBJECT语义异常提示期望的对象类型。5. DDL 生成CREATE VIEW 语句从何而来Create View列的内容由 AstToStringBuilder.java 根据视图的元数据动态生成。对于普通视图生成逻辑为拼装CREATE VIEW \view_name (col1, col2, ...)逐列输出视图的 base schema若列带注释则追加COMMENT ...追加视图级注释COMMENT子句根据安全模式输出SECURITY INVOKER或SECURITY NONE最后追加AS 视图内联定义并补上分号。其中SECURITY子句与视图的访问控制相关SECURITY INVOKER表示查询视图时按调用者权限校验底层表SECURITY NONE则按视图创建者权限执行对应测试用例见 ShowCreateViewStmtTest.java该测试同时验证了带注释列、表达式列如concat(, null)、SELECT *展开、别名列等场景下 DDL 重建的正确性。6. 测试验证FE 端提供了针对该命令的单元测试 ShowCreateViewStmtTest.java其中testShowCreateView用例创建了一个带列注释和视图注释的视图并断言其重建 DDL 与预期完全一致可用于验证视图定义的可逆性。与其他 SHOW CREATE 命令的关系由于SHOW CREATE VIEW、SHOW CREATE TABLE、SHOW CREATE MATERIALIZED VIEW共享同一语法规则与语句节点它们的区别主要体现在关键字与返回结果上命令目标对象返回结果列SHOW CREATE VIEW普通视图v2.5.4 起也可查询物化视图以标准CREATE VIEW语法返回View / Create View / character_set_client / collation_connectionSHOW CREATE TABLE普通表含外部表、临时表Table / Create TableSHOW CREATE MATERIALIZED VIEW物化视图Materialized View / Create Materialized View值得说明的是SHOW CREATE VIEW的返回值是可直接执行的完整 DDL配合 CREATE_VIEW.md、ALTER_VIEW.md、DROP_VIEW.md 中的视图管理命令即可完成视图的全生命周期管理关于视图本身的创建语法、列定义与安全模式等更详细约定可参阅 View.mdx。使用注意事项权限要求必须同时具备视图与基表的SELECT权限否则会触发AccessDeniedException。默认数据库省略db_name时按当前会话所在数据库解析视图跨库查询请显式写全db_name.view_name。对象类型匹配SHOW CREATE VIEW的目标必须是视图或物化视图对普通表执行会抛出对象类型不匹配错误ERR_WRONG_OBJECT此时应改用SHOW CREATE TABLE。输出兼容性结果集中的character_set_client、collation_connection列是面向 MySQL 客户端兼容设计的固定值不应将其理解为实际会话的字符集配置。敏感信息Create View列中的语句由视图元数据动态生成不会泄露底层数据内容可放心用于审计与迁移场景重建视图时请留意视图依赖的基表在当前集群中是否已就绪。【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考