排查 SAP BDC 访问权限问题

本页面介绍了如何解决将 SAP Business Data Cloud (BDC) 与 BigQuery 集成时的常见问题。对于 SAP 到 Google Cloud(联合)工作流,请参阅 Lakehouse 问题排查页面。

查询表时出现 NOT_FOUND 或 PERMISSION_DENIED 错误

当 SAP BDC 端撤消访问权限时,就会出现此问题。对受影响表的查询会失败,并返回源自 Delta Sharing 端点的“未找到”或“权限遭拒”错误。

如需解决此问题,请与您的 SAP 管理员合作,恢复对表的访问权限。如需详细了解 SAP 中的访问管理,请参阅 SAP 文档中的在 SAP Business Data Cloud Connect 中使用数据产品。

无法将数据写入 SAP BDC 表

当您尝试从 BigQuery 写入或修改 SAP BDC 表中的数据时,会出现此问题。此集成提供对 SAP BDC 数据的只读权限。

如需解决此问题,请直接在 SAP BDC 中修改数据。

Delta Sharing API 调用产生意外费用

如果 Lakehouse 目录与 SAP BDC 同步过于频繁,则可能会出现此问题,因为 SAP BDC 会调用 Delta Sharing API 来列出表并获取表元数据。这些 API 调用会按 Lakehouse A 类操作计费。

如需解决此问题,请增加目录的刷新间隔,以降低 API 调用频率。如需详细了解价格,请参阅 Lakehouse 价格。

SAP 无法找到或查询已发布的表

如果 SAP BDC 所需的 Apache Iceberg 元数据未在 Cloud Storage 存储桶中正确生成,则可能会出现此问题。

如需解决此问题,请验证表后备存储路径中是否存在预期的元数据文件:

  1. 列出表的 metadata 文件夹的内容:

    gcloud storage ls "gs://BUCKET_NAME/NAMESPACE_NAME/TABLE_NAME/metadata/"
  2. 验证输出是否包含标准 Apache Iceberg 元数据文件,包括:

    • version-hint.txt
    • v*.metadata.json
    • 清单文件 (.avro)。如果缺少这些文件,请检查 Iceberg REST 目录配置或 BigQuery 中的写入操作,确保数据和元数据已成功具体化到存储桶。

表发布失败,并显示缺少主键或可为 null 的字段错误

当您将 Apache Iceberg 目录或数据产品发布到 SAP BDC,但该目录或数据产品中的表未在其 Iceberg 元数据中定义主键,或者其中一个主键列被定义为可为 null (required: false) 时,就会出现此问题。

发生这种情况时,发布会失败,并显示以下错误之一:

  • INVALID_ARGUMENT: Failed to generate Core Schema Notation (CSN) payload: Table 'TABLE_NAME' must have a primary key constraint to be published to SAP.
  • INVALID_ARGUMENT: Field COLUMN_NAME is not required, but is referenced in the identifier-field-ids property.

SAP BDC 要求所有已发布的表在 Iceberg 元数据中使用 identifier-field-ids 定义主键约束条件。根据 Apache Iceberg 规范,identifier-field-ids 中指定的所有列也必须配置为不可为 null (required: true)。

如需解决此问题,请使用 BigLake Iceberg REST API 执行原子架构更新,将主键列标记为 required: true,并在 identifier-field-ids 中指定其字段 ID:

  1. 获取授权访问令牌:

    TOKEN=$(gcloud auth application-default print-access-token)
  2. 使用 Python 发送 Iceberg REST 架构更新提交:

    import requests
    
    headers = {
        "Authorization": f"Bearer {TOKEN}",
        "x-goog-user-project": "PROJECT_ID",
        "X-Iceberg-Access-Delegation": "vended-credentials",
        "Content-Type": "application/json",
    }
    url = "https://biglake.googleapis.com/iceberg/v1/restcatalog/v1/projects/PROJECT_ID/catalogs/ICEBERG_CATALOG_ID/namespaces/NAMESPACE_NAME/tables/TABLE_NAME"
    
    # 1. Fetch current metadata
    meta = requests.get(url, headers=headers).json()["metadata"]
    schema = meta["schemas"][0].copy()
    schema["fields"] = [f.copy() for f in schema["fields"]]
    
    # 2. Mark primary key column as required (non-nullable) and set identifier-field-ids
    for f in schema["fields"]:
      if f["name"] == "PRIMARY_KEY_COLUMN_NAME":
        f["required"] = True
    schema["identifier-field-ids"] = [PRIMARY_KEY_FIELD_ID]
    schema["schema-id"] = meta.get("last-schema-id", 0) + 1
    
    # 3. Commit the updated schema
    update_payload = {
        "requirements": [{"type": "assert-table-uuid", "uuid": meta["table-uuid"]}],
        "updates": [
            {
                "action": "add-schema",
                "schema": schema,
                "last-column-id": meta.get("last-column-id", 0),
            },
            {"action": "set-current-schema", "schema-id": -1},
        ],
    }
    response = requests.post(url, headers=headers, json=update_payload)
    response.raise_for_status()

    替换以下内容:

    • PROJECT_ID:您的 Google Cloud 项目 ID。
    • ICEBERG_CATALOG_ID:您的 Iceberg REST 目录 ID。
    • NAMESPACE_NAME:Iceberg 命名空间名称。
    • TABLE_NAME:Iceberg 表名称。
    • PRIMARY_KEY_COLUMN_NAME:要设置为主键的列的名称。
    • PRIMARY_KEY_FIELD_ID:主键列的整数字段 ID(例如 1)。

对 SAP 的查询失败,并显示权限错误或未找到错误

如果目录或数据产品发布到 SAP BDC 后,BigQuery 中的访问权限被撤消或权限被修改,则可能会出现此问题。对受影响表的查询将在 SAP 端失败,通常会显示源自 BigQuery 的“未找到”或“权限遭拒”错误。

如需解决此问题,请验证工作负载身份联合主账号是否保留了所需角色(例如 BigLake Viewer),以及是否已授予标准 BigQuery 数据集或表访问权限。如需详细了解如何在 SAP 中安装和使用数据产品,请参阅 SAP 文档中的安装数据产品。

新表或元数据更改未显示在 SAP BDC 中

当您在 Apache Iceberg REST 目录端点或 Knowledge Catalog Data Product 中添加新表或更新现有表元数据时,可能会出现此问题,但 SAP 使用者看不到这些更改。虽然底层数据保持最新,但元数据更新可能需要明确的操作。

如需解决此问题,请对目录或数据产品执行新的发布操作 (gcloud biglake data-product-sharing publish),以便在 SAP BDC 中发现新元数据。

无法将数据从 SAP 写回 BigQuery

当您尝试使用已发布的 SAP 集成从 SAP BDC 在 BigQuery 中写入或修改数据时,会出现此问题。此集成提供从 SAP BDC 对 BigQuery 数据的只读权限,以防止意外覆盖数据或违反安全规定。

如需解决此问题,请直接使用 BigQuery 或标准 Google Cloud 流水线来操作和写入源数据。

查询表时出现 RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER 错误

如果您的环境强制执行 VPC Service Controls,并且应用于项目的边界限制了 storage.googleapis.com 服务,则可能会发生此问题。由于 Dremel 在查询表时需要读取 SAP 项目中的传入 Cloud Storage 存储桶,因此该请求会被禁止,因为 SAP 项目位于边界之外。

如需解决此问题,请配置 VPC Service Controls 出站规则。如需详细了解配置,请参阅适用于 SAP BDC 的 VPC Service Controls 配置。