如何自动化校验Redshift表/列在Tableau Server中的使用情况?
Redshift与Tableau Server表/列使用情况自动化校验方案
针对你需要自动检查Redshift表/列是否在Tableau Server仪表盘中被使用的需求,以下是几种落地可行的方案:
方案一:通过Tableau Server REST API 检索依赖关系
Tableau REST API支持无需界面登录即可获取所有内容的元数据,适合做自动化校验:
身份认证:调用
sign-in接口获取认证令牌和站点ID,示例Python代码:import requests tableau_server = "http://your-tableau-server:8000" username = "admin" password = "your-password" site_name = "your-site" auth_url = f"{tableau_server}/api/3.10/auth/signin" payload = { "credentials": { "name": username, "password": password, "site": {"contentUrl": site_name} } } response = requests.post(auth_url, json=payload) token = response.json()["credentials"]["token"] site_id = response.json()["credentials"]["site"]["id"] headers = {"X-Tableau-Auth": token}筛选Redshift数据源:调用
datasources接口遍历站点内所有数据源,筛选出Redshift类型的连接:datasources_url = f"{tableau_server}/api/3.10/sites/{site_id}/datasources" response = requests.get(datasources_url, headers=headers) datasources = response.json()["datasources"]["datasource"] redshift_datasources = [ds for ds in datasources if ds["connectionType"] == "redshift"]解析表/列映射关系:对每个Redshift数据源,调用
datasource/fields接口提取对应的Redshift schema、表、列,以及关联的工作簿:def get_redshift_fields(datasource_id): fields_url = f"{tableau_server}/api/3.10/sites/{site_id}/datasources/{datasource_id}/fields" response = requests.get(fields_url, headers=headers) fields = response.json()["fields"]["field"] redshift_fields = [] for field in fields: if field.get("remoteName"): # remoteName格式为:schema.table.column parts = field["remoteName"].split(".") if len(parts) == 3: redshift_fields.append({ "schema": parts[0], "table": parts[1], "column": parts[2], "related_workbooks": [wb["name"] for wb in field.get("workbooks", {}).get("workbook", [])] }) return redshift_fields快速校验:将提取的映射关系存储到本地缓存或数据库,当需要校验Redshift的
A.t1.c1时,直接查询缓存即可返回关联的Tableau内容。
方案二:直接查询Tableau Server的Postgres元数据库
Tableau Server的所有元数据都存储在自带的Postgres数据库中,直接查询效率更高:
连接Tableau Postgres:找到Tableau Server的Postgres配置(默认端口8060,用户
tableau,密码可在Tableau配置文件中获取),用工具或代码建立连接。关联查询依赖关系:通过SQL关联元数据表,直接筛选出Redshift表/列对应的Tableau内容,示例SQL:
SELECT w.name AS 工作簿名称, ds.name AS 数据源名称, SUBSTRING(c.connection_string FROM 'schema=([^;]+)') AS redshift_schema, SUBSTRING(f.remote_name FROM '([^\.]+)\.([^\.]+)$') AS redshift_table, f.remote_name AS redshift_column FROM workbooks w LEFT JOIN datasources ds ON w.datasource_id = ds.id LEFT JOIN connections c ON ds.connection_id = c.id LEFT JOIN fields f ON ds.id = f.datasource_id WHERE c.connection_type = 'redshift' -- 替换为要校验的对象 AND SUBSTRING(c.connection_string FROM 'schema=([^;]+)') = 'A' AND SUBSTRING(f.remote_name FROM '([^\.]+)\.([^\.]+)$') = 't1' AND f.remote_name LIKE '%.c1'定期同步元数据:可以将查询结果同步到Redshift的一张专用表(如
tableau_dependencies),方便管理员直接在Redshift中查询校验。
方案三:整合自动化校验流程
将上述方法集成到日常变更流程中:
- 编写定时脚本(如Python+CRON),每天同步Tableau元数据到本地或Redshift的依赖表。
- 在Redshift的DDL变更前,调用脚本查询依赖表,若存在关联的Tableau内容则触发告警。
- 封装成命令行工具,管理员只需输入
schema.table.column即可快速得到结果:python check_tableau_dependency.py --schema A --table t1 --column c1
注意事项
- 权限要求:无论是调用REST API还是查询Postgres,都需要Tableau Server管理员权限。
- 提取数据源适配:如果Tableau使用的是Redshift数据提取(Extract),需校验提取对应的原始Redshift表结构,而非提取文件本身。
- 版本兼容:你的Tableau Server版本是2021.1.4,对应REST API版本为3.10,需确保API调用使用正确的版本号。
内容的提问来源于stack exchange,提问作者dizzy
相关产品推荐
相关产品推荐

