我正在找哪些新列都被添加到表中了。有什么办法能找到吗?在创建或修改带有时间戳的表时,我正在考虑获取所有列,以便我能够筛选那些是新列。
使用INFORMATION_SCHEMA.SCHEMATA,我只获得表创建和修改日期,而不是列。
使用INFORMATION_SCHEMA.COLUMNS,我能够获得所有的列名和它的信息,但没有关于修改或创建时间戳的详细信息。
我的表没有快照,因此无法将其与以前的版本进行比较以获得更改。
有什么办法能抓住这个吗?
发布于 2021-12-21 21:48:11
根据BigQuery列文档,这不是BigQuery当前捕获的元数据。
一个可能的解决方案是进入BigQuery日志,查看何时以及如何更新表。对创建这些表的架构和脚本的源代码控制还可以让您深入了解如何以及何时添加列。
发布于 2021-12-22 04:03:56
正如@RileyRunnoe所提到的那样,这样的元数据不会被BQ捕获,一个可能的解决方案是深入审计日志。在这样做之前,您应该已经创建了指向数据集的BQ接收器。有关更多详细信息,请参阅创建一个水槽。
创建接收器时,要执行的所有操作都将将数据使用日志存储在表cloudaudit_googleapis_com_data_access_YYYYMMDD中,并将活动日志存储在您在接收器中选择的BigQuery数据集中的表cloudaudit_googleapis_com_activity_YYYYMMDD中。请记住,您只能从设置日志导出表的日期开始跟踪使用情况。
下面的查询具有一个从cloudaudit_googleapis_com_data_access_*查询的CTE,因为它记录了数据的更改,并且只得到完成的作业,因此对jobservice.jobcompleted进行了过滤。查询CTE以获得包含"COLUMN"的查询,而不包含没有像我们将要运行的查询那样的目标表的查询。
WITH CTE AS (
SELECT
protopayload_auditlog.methodName,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobConfiguration.query.query as query,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobStatus.state as status,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobConfiguration.query.destinationTable.datasetId as dataset,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobConfiguration.query.destinationTable.tableId as table,
timestamp
FROM `my-project.dataset_name.cloudaudit_googleapis_com_data_access_*`
WHERE protopayload_auditlog.methodName = 'jobservice.jobcompleted'
)
SELECT query,
REGEXP_EXTRACT(query,r'ADD COLUMN (\w+) \w+') as column,
table,
timestamp,
status
FROM CTE
WHERE query like '%COLUMN%'
AND NOT REGEXP_CONTAINS(dataset, r'^_')
ORDER BY timestamp DESC结果:

https://stackoverflow.com/questions/70440285
复制相似问题