调用Node SDK更新BigQuery定时查询notificationPubsubTopic配置报错
问题现象
使用Node版DataServiceTransferClient API/SDK创建带notificationPubsubTopic配置的BigQuery定时查询时,创建流程无异常,但执行更新操作会返回错误:
INVALID_ARGUMENT: notificationPubsubTopic cannot be updated.
复现代码如下:
const config = { transferConfig: { /* 其余配置项 */ notificationPubsubTopic: "projects/engineering/topics/test" }, updateMask: { paths: [ "params.query", "params.write_disposition", "params.destination_table_name_template", "schedule", "notificationPubsubTopic" ], }, } dataTransferClient.updateTransferConfig(config)
已知前置条件:
- 测试用Pub/Sub主题均真实存在,通过BigQuery UI控制台可以正常给定时查询更新绑定这些主题,无报错
- 哪怕传入的是当前定时查询已经绑定的原有
notificationPubsubTopic值,更新操作依然失败 - 只要不传
notificationPubsubTopic属性,同时把该字段从updateMask路径列表中移除,更新操作就能正常执行
根本原因
这是BigQuery Data Transfer Service API的固定字段限制:notificationPubsubTopic属于通知类敏感配置字段,通用的updateTransferConfig接口本身就不支持修改该字段——不管你传入的值和现有值是否一致,只要updateMask里包含这个字段,接口就会直接抛出INVALID_ARGUMENT错误。
UI控制台能正常修改主题绑定,是因为控制台在你操作修改Pub/Sub配置时,调用的不是通用更新接口,而是单独的通知配置更新链路,会先完成BigQuery服务账号对目标主题的发布权限校验,再写入配置,和普通更新接口走的不是一套逻辑。
解决方法
根据实际需求选对应方案即可:
- 不需要修改绑定的Pub/Sub主题时:直接把
notificationPubsubTopic从updateMask.paths里删掉,也不用在transferConfig中传这个字段,原有绑定的主题会保留,其余字段的更新不受影响 - 需要通过API/SDK修改绑定的Pub/Sub主题时:不要在通用更新接口里传这个字段,调用SDK封装的单独更新通知配置的方法即可,调用前要先给BigQuery服务账号授予目标Pub/Sub主题的
pubsub.topics.publish权限,否则会报权限错误 - 所用SDK版本没有封装单独通知更新方法时,可以先删除原有定时查询配置,保留原有调度规则和作业历史,用新的
notificationPubsubTopic参数重新创建同名传输配置,也能达到修改主题的效果
内容的提问来源于stack exchange,提问作者callmetwan
相关产品推荐
相关产品推荐

