ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

TDengine 视图(View)功能全解:创建、查询、权限管理与使用限制

TDengine 视图(View)功能全解:创建、查询、权限管理与使用限制 TDengine 视图View功能全解创建、查询、权限管理与使用限制【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengineTDengine 自 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_nameVARCHAR视图名称db_nameVARCHAR视图所属数据库effective_userVARCHAR视图有效用户即创建用户create_timeTIMESTAMP视图创建时间typeVARCHAR视图类型query_sqlVARCHAR视图定义的查询语句parametersVARCHAR参数定义用于参数化视图场景default_valuesVARCHAR参数默认值target_tableVARCHAR目标表名删除视图DROP VIEW [IF EXISTS] [db_name.]view_name;视图权限体系权限分类视图权限分为三种与操作一一对应权限对应操作READ查询SELECT视图WRITE向视图写入INSERT数据ALTER对视图本身的修改与删除在源码层面视图权限在 include/util/tpriv.h 中被定义为独立的管理对象PRIV_VIEW_CREATE 88CREATE VIEW与PRIV_VIEW_SELECTSELECT 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.yAST 节点在 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持久化到系统数据库元数据缓存视图元数据按viewNameviewId 版本号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),仅供参考
返回列表