TDengine 视图(View)功能全解:创建、查询、权限管理与使用限制
【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine
TDengine 自 3.2.1.0 起在企业版中提供视图(View)功能,将一条查询语句以"虚拟表"的形式固化在数据库中,用于简化复杂查询的复用、在用户间共享查询定义。视图本身不存储数据,仅在读取时动态执行其定义查询。本文以官方 SQL 参考文档为主体,结合仓库源码,系统讲解视图的语法、权限模型、使用场景与实现原理,读完即可在企业版集群中安全、规范地使用视图。
视图的本质与使用规则
视图(View)本质上是一条存储在数据库中的查询语句,属于非物化视图——自身不包含任何数据,只有在读取视图时才动态执行其定义中的查询。创建视图时为其指定名称后,就可以像普通表一样对其进行查询等操作。
使用视图必须遵循以下规则:
- 视图可以嵌套定义和使用,并绑定到创建时指定的数据库(或当前数据库);
- 同一数据库内,视图名称不允许重名;同时建议视图名不要与表名重名(不强制)。当视图与表同名时,写入、查询、授权、回收权限等操作会优先使用同名表。
从实现角度看,视图在元数据层面与表分离:在 include/libs/catalog/catalog.h 中,表元数据STableMeta通过isView字段标记是否为视图,并以独立的SViewMeta结构体(含viewName、viewId及版本号)维护视图元数据;在 include/util/tpriv.h 中,权限对象级别枚举PRIV_OBJ_VIEW = 6也表明视图是独立于数据库与表的授权对象。
视图语法
创建(更新)视图
CREATE [ OR REPLACE ] VIEW [db_name.]view_name AS query说明:
- 创建时可指定视图所属数据库
db_name;未指定时默认为当前连接所绑定的数据库; - 查询语句(
query)中建议显式指定数据库名,以支持跨库视图;未指定时默认使用与视图绑定的数据库(可能不是当前连接的数据库)。
OR REPLACE用于覆盖(更新)已存在的同名视图,此时除满足创建权限外,还要求用户对旧视图具备ALTER权限。
查看视图
TDengine 提供四种查看方式:
- 查看某个数据库下的所有视图:
SHOW [db_name.]VIEWS;- 查看视图的创建语句:
SHOW CREATE VIEW [db_name.]view_name;- 查看视图列信息:
DESCRIBE [db_name.]view_name;- 通过系统信息表查看所有视图的详细信息:
SELECT ... FROM information_schema.ins_views;其中information_schema.ins_views是查看视图信息最灵活的途径。系统信息表ins_views的列定义位于 source/common/src/systable.c,注册于 source/common/src/systable.c,包含以下字段:
| 字段 | 类型 | 说明 |
|---|---|---|
view_name | VARCHAR | 视图名称 |
db_name | VARCHAR | 视图所属数据库 |
effective_user | VARCHAR | 视图有效用户(即创建用户) |
create_time | TIMESTAMP | 视图创建时间 |
type | VARCHAR | 视图类型 |
query_sql | VARCHAR | 视图定义的查询语句 |
parameters | VARCHAR | 参数定义(用于参数化视图场景) |
default_values | VARCHAR | 参数默认值 |
target_table | VARCHAR | 目标表名 |
删除视图
DROP VIEW [IF EXISTS] [db_name.]view_name;视图权限体系
权限分类
视图权限分为三种,与操作一一对应:
| 权限 | 对应操作 |
|---|---|
READ | 查询(SELECT)视图 |
WRITE | 向视图写入(INSERT)数据 |
ALTER | 对视图本身的修改与删除 |
在源码层面,视图权限在 include/util/tpriv.h 中被定义为独立的管理对象:PRIV_VIEW_CREATE = 88(CREATE VIEW)与PRIV_VIEW_SELECT(SELECT VIEW),并与通用READ/WRITE/ALTER权限共同构成视图授权体系。
权限规则
- 视图的创建者和
root用户默认具备全部权限; - 对其他用户的授权与回收通过
GRANT/REVOKE语句完成,且只能由root用户执行; - 视图权限需要单独授权与回收,通过
db.*进行的库级授权与回收不包含视图权限; - 视图可嵌套定义与使用,相应地,权限校验也会递归进行;
- 为便于分享与使用,引入**视图有效用户(即视图创建用户)**概念:被授权用户可以使用该有效用户对库、表及嵌套视图的读写权限。注意:视图被
REPLACE后,有效用户也会随之更新。
权限控制明细表
具体权限控制规则如下表:
| 序号 | 操作 | 权限要求 | | -- | --- | --- | | 1 |CREATE VIEW(创建新视图) | 用户对视图所属数据库有WRITE权限,且对视图引用的库、表、视图有查询权限;若引用对象仍是视图,还需满足下表第 8 条 | | 2 |CREATE OR REPLACE VIEW(覆盖旧视图) | 用户对视图所属数据库有WRITE权限,且对旧视图有ALTER权限;并对视图引用的库、表、视图有查询权限;若引用对象仍是视图,还需满足第 8 条 | | 3 |DROP VIEW| 用户对视图有ALTER权限 | | 4 |SHOW VIEWS| 无 | | 5 |SHOW CREATE VIEW| 无 | | 6 |DESCRIBE VIEW| 无 | | 7 | 系统表查询 | 无 | | 8 |SELECT FROM VIEW| 操作用户对视图有READ权限,且操作用户或视图有效用户对视图引用的库、表、视图有READ权限 | | 9 |INSERT INTO VIEW| 操作用户对视图有WRITE权限,且操作用户或视图有效用户对视图引用的库、表、视图有WRITE权限 | | 10 |GRANT/REVOKE| 仅root有权限 |
需要注意的是,SHOW VIEWS虽然不需要显式授权(在 source/common/src/tpriv.c 中其被映射为公开的PRIV_CM_SHOW类别),但对视图的SELECT/INSERT仍必须满足上表第 8、9 条要求——这正是"视图便于共享"与"底层数据安全"之间的平衡点。
授权语法
GRANT privileges ON [db_name.]view_name TO user_name privileges: { ALL | priv_type [, priv_type] ... } priv_type: { READ | WRITE | ALTER }回收权限语法
REVOKE privileges ON [db_name.]view_name FROM user_name privileges: { ALL | priv_type [, priv_type] ... } priv_type: { READ | WRITE | ALTER }使用场景支持矩阵
视图在不同使用方式下的支持情况如下:
| SQL 查询 | SQL 写入 | STMT 查询 | STMT 写入 | 订阅 | 流式计算 |
|---|---|---|---|---|---|
| 支持 | 暂不支持 | 暂不支持 | 暂不支持 | 支持 | 暂不支持 |
即当前版本中,视图可以像普通表一样被 SQL 直接查询,也可以作为数据订阅(Subscription)的数据源;但 STMT(参数化预编译)查询/写入、SQL 写入视图以及流式计算引用视图均暂不支持,规划使用场景时需要避开这些能力组合。
完整示例
创建视图
-- 基于普通表创建视图:按天聚合统计 CREATE VIEW view1 AS SELECT _wstart, COUNT(*) FROM table1 INTERVAL(1d); -- 基于普通表创建视图:仅暴露部分列 CREATE VIEW view2 AS SELECT ts, col2 FROM table1; -- 视图嵌套:基于视图再创建视图 CREATE VIEW view3 AS SELECT * FROM view1;查询视图
SELECT * FROM view1;视图查询按定义动态执行底层语句,因此底层表新增数据后,查询视图即可看到最新聚合结果。
删除视图
DROP VIEW view1;源码视角:视图的完整生命周期
从仓库源码可以勾勒出视图从创建到使用的完整链路:
- 语法解析:
CREATE / DROP / SHOW VIEW相关语法定义于 source/libs/parser/inc/sql.y,AST 节点在 source/libs/parser/inc/parAst.h 中定义,由 source/libs/parser/src/parAstCreater.c 负责生成; - 管理节点处理:视图的创建、删除与元数据获取请求分别由
mndProcessCreateViewReq、mndProcessDropViewReq、mndProcessGetViewMetaReq处理(接口声明见 source/dnode/mnode/impl/inc/mndView.h),并经由mndViewActionInsert/mndViewActionDelete/mndViewActionUpdate持久化到系统数据库; - 元数据缓存:视图元数据按
viewName+viewId+ 版本号(SViewVersion/SDynViewVersion)在 catalog 层维护缓存与失效,相关接口catalogGetViewMeta、catalogRemoveViewMeta等定义于 include/libs/catalog/catalog.h; - 权限校验:视图被当作独立授权对象(
PRIV_OBJ_VIEW)进行校验,且对嵌套视图递归校验,这与官方文档中"权限校验递归进行"的规则一致。
小结
视图是 TDengine 企业版 3.2.1.0 起提供的重要能力,它以极低的成本(仅存储一条查询语句)实现了查询逻辑的复用与跨用户共享。使用时的三个关键要点是:视图名与表名建议避免重名、视图权限需单独按对象授权(db.*授权不含视图)、以及"有效用户"机制让被授权用户在不直接接触底层表的情况下安全复用视图。结合information_schema.ins_views系统表,可以方便地对全库视图进行统一审计与管理。
【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考