| 一、背景说明: 历史已经设置了很多数据行列权限,受调整用户及以用户组影响,更新用户及用户组后,担心行列权限受影响,需要批量查询及备份。但是目前没有界面可以批量导出或者批量查询,只能凭印象,但目前数据集太多,甚至有几百上千个,统计工作量很大,所以希望通过元数据库查询数据集的数据安全模块开通情况。 二、SQL 方案: 1、过滤版 SQL方案:只返回已开启数据安全的数据集,适合快速盘点当前命中对象。 SELECT ds.dom_id, ds.ds_id, ds.name, ds.sf_template_id, tpl.name AS template_name, CASE WHEN COALESCE(ds.sf_template_id, '') <> '' THEN 'TEMPLATE' ELSE 'DIRECT' END AS security_source, CASE WHEN COALESCE(ds.sf_template_id, '') <> '' THEN JSON_UNQUOTE(JSON_EXTRACT(tpl.content, '$.securityFilterRowLevelEnabled')) ELSE JSON_UNQUOTE(JSON_EXTRACT(ds.config, '$.securityFilterRowLevelEnabled')) END AS row_enabled, CASE WHEN COALESCE(ds.sf_template_id, '') <> '' THEN JSON_UNQUOTE(JSON_EXTRACT(tpl.content, '$.securityFilterColumnLevelEnabled')) ELSE JSON_UNQUOTE(JSON_EXTRACT(ds.config, '$.securityFilterColumnLevelEnabled')) END AS column_enabled, ds.utime FROM data_source ds LEFT JOIN security_filter_template tpl ON ds.dom_id = tpl.dom_id AND ds.sf_template_id = tpl.template_id AND tpl.is_del = 0 WHERE ds.is_del = 0 AND ( ( COALESCE(ds.sf_template_id, '') <> '' AND ( JSON_UNQUOTE(JSON_EXTRACT(tpl.content, '$.securityFilterRowLevelEnabled')) = 'true' OR JSON_UNQUOTE(JSON_EXTRACT(tpl.content, '$.securityFilterColumnLevelEnabled')) = 'true' ) ) OR ( COALESCE(ds.sf_template_id, '') = '' AND ( JSON_UNQUOTE(JSON_EXTRACT(ds.config, '$.securityFilterRowLevelEnabled')) = 'true' OR JSON_UNQUOTE(JSON_EXTRACT(ds.config, '$.securityFilterColumnLevelEnabled')) = 'true' ) ) ) ORDER BY ds.utime DESC; BI数据集过滤版数据结构详情图: 2、全量打标版 SQL方案:返回全部数据集,并增加 security_enabled / security_source / row_enabled / column_enabled 等字段,适合后续抽取为 BI 数据集继续筛选、统计和分析。 SELECT ds.dom_id, ds.ds_id, ds.name, ds.sf_template_id, tpl.name AS template_name, CASE WHEN COALESCE(ds.sf_template_id, '') <> '' THEN 'TEMPLATE' ELSE 'DIRECT' END AS security_source, CASE WHEN COALESCE(ds.sf_template_id, '') <> '' THEN JSON_UNQUOTE(JSON_EXTRACT(tpl.content, '$.securityFilterRowLevelEnabled')) ELSE JSON_UNQUOTE(JSON_EXTRACT(ds.config, '$.securityFilterRowLevelEnabled')) END AS row_enabled, CASE WHEN COALESCE(ds.sf_template_id, '') <> '' THEN JSON_UNQUOTE(JSON_EXTRACT(tpl.content, '$.securityFilterColumnLevelEnabled')) ELSE JSON_UNQUOTE(JSON_EXTRACT(ds.config, '$.securityFilterColumnLevelEnabled')) END AS column_enabled, CASE WHEN ( CASE WHEN COALESCE(ds.sf_template_id, '') <> '' THEN JSON_UNQUOTE(JSON_EXTRACT(tpl.content, '$.securityFilterRowLevelEnabled')) ELSE JSON_UNQUOTE(JSON_EXTRACT(ds.config, '$.securityFilterRowLevelEnabled')) END = 'true' ) OR ( CASE WHEN COALESCE(ds.sf_template_id, '') <> '' THEN JSON_UNQUOTE(JSON_EXTRACT(tpl.content, '$.securityFilterColumnLevelEnabled')) ELSE JSON_UNQUOTE(JSON_EXTRACT(ds.config, '$.securityFilterColumnLevelEnabled')) END = 'true' ) THEN 'true' ELSE 'false' END AS security_enabled, ds.row_count, ds.col_count, ds.utime FROM data_source ds LEFT JOIN security_filter_template tpl ON ds.dom_id = tpl.dom_id AND ds.sf_template_id = tpl.template_id AND tpl.is_del = 0 WHERE ds.is_del = 0 ORDER BY ds.utime DESC; BI数据集全量版数据结构详情图: 3、字段释义: 为便于后续抽取、验证与向客户或内部同学解释结果,下表对 SQL 中输出的核心字段做统一说明。其中,过滤版 SQL 与全量打标版 SQL 的主字段基本一致;全量打标版额外增加了 security_enabled 这一综合打标字段。
三、结果解读建议 1)若 security_enabled = 'true',表示该数据集当前已开通数据安全。 2)若 security_source = 'TEMPLATE',表示该数据集的数据安全配置来自模板下发;此时 row_enabled / column_enabled 应以 security_filter_template.content 中的开关解释。 3)若 security_source = 'DIRECT',表示该数据集直接在自身配置中开启了数据安全;此时 row_enabled / column_enabled 应以 data_source.config 中的开关解释。 4)若 row_enabled 与 column_enabled 均为 false,则 security_enabled 应为 false,这类数据集虽然存在于全量打标版 SQL 中,但不属于已开通数据安全对象。 |