使用用户定义的标签自动传播标签

如果将 对象标签 应用于源对象,则标签传播会自动为目标对象分配对象标签。例如,您可以在源对象(例如表及其列)上定义标签,这些标签会自动传播到目标对象,例如从该源对象创建的视图或其他表。

自动标签传播的优势包括:

  • 简化跨对象标签管理,特别是在将标签应用于源对象或列以便于发现和保护数据时。

  • 确保与标签关联的任何策略都自动应用于目标对象。

只有具有账户级别 APPLY TAG 权限的标签所有者才能实现自动标签传播。

传播的类型

当存在 对象依赖关系 和/或 数据移动 时,您可以选择传播标签。

对象依赖关系的标签传播

当为对象依赖关系配置标签传播时,标签将从源对象传播到基于它的所有目标对象。例如,如果您为表 t1 上的标签 data_sensitivity 设置传播,然后基于 t1 创建两个视图,则该 data_sensitivity 标签将传播到两个视图。

从源对象创建视图、安全视图、物化视图或动态表被视为对象依赖关系。

对象依赖关系的持续传播

为对象依赖关系配置标签后,Snowflake 会在出现以下任何情况时 持续更新 目标对象:

  • 该标签被添加到源对象或列中。

  • 标签的值已更新。

  • 标签已从源对象或列中移除。在这种情况下,Snowflake 会将标签从目标对象或列中移除。

例如,假设标签 data_sensitivity 在执行 CREATE VIEW 语句后从表 t1 传播到视图 v2。当您更改 t1 上的 data_sensitivity 值时,v2 上标签的值也会随之更新。

自动标签传播依赖于源对象的存在。如果删除带有标签的源对象,则标签不会传播到目标对象。由于视图依赖于其源,例如基表或其他视图,因此标签仅在源对象存在时才会传播。

用于数据移动的标签传播

如果为数据移动配置了标签传播,则当您通过执行以下任一操作将数据从源对象移动到另一个对象时,就会传播标签:

  • 执行 CREATE TABLE ... AS SELECT (CTAS) 语句来创建表。

  • 执行 CREATE DYNAMIC TABLE 语句。

  • 执行数据操作语言 (DML) 命令。以下 DML 命令会触发标签传播:

    • INSERT

    • MERGE

    • UPDATE

    • COPY INTO

CREATE TABLE ... CLONECREATE TABLE ... LIKE 不依赖 PROPAGATE 标签属性进行标签传播。当您执行这些语句时,源中的标签始终会分配给目标对象。

备注

与针对对象依赖关系的标签传播不同,数据移动时应用于目标对象的标签 不会 随着源对象上标签的变化而持续更新。

设置标签传播

要启用自动标签传播,请使用 CREATE TAG 或 ALTER TAG 命令来设置 PROPAGATE 属性。您可以配置该属性,以便针对对象依赖关系和/或数据移动传播标签。

有关设置标签传播的说明,请参阅 定义一个将自动传播的标签

标签传播冲突

当标签从不同的源对象传播到同一个目标对象时,可能会发生冲突。如果标签在每个源对象中具有不同的值,则当该标签从源对象传播到目标对象时会发生冲突。

备注

如果目标对象的标签为手动应用,则现有标签值优先于传播的值,这样就不会发生冲突。

如果目标对象继承了 Snowflake 对象层次结构中级别较高的对象的值,则传播值优先,不存在冲突。

标签的 ON_CONFLICT 属性决定了发生冲突时会发生什么。您可以使用三种方法来处理标签传播冲突:

  • 选项 1: 用字符串 CONFLICT 替换标签的值。如果您未设置标签的 ON_CONFLICT 参数,则这是默认设置。

  • 选项 2: 用用户定义的字符串替换标签的值。您可以将 ON_CONFLICT 参数设置为该字符串。

    例如,如果您希望标签的值在值冲突时为 HIGHLY CONFIDENTIAL,请使用下面的 SQL 创建标签:

    CREATE TAG data_sensitivity
      PROPAGATE = ON_DEPENDENCY_AND_DATA_MOVEMENT
      ON_CONFLICT = 'HIGHLY CONFIDENTIAL';
    
    Copy
  • 选项 3: 使用标签 ALLOWED_VALUES 参数中值的顺序来确定要使用哪个值。设置 ON_CONFLICT = ALLOWED_VALUES_SEQUENCE 以实现此策略。

    例如,假设您使用以下 SQL 语句创建了标签:

    CREATE TAG data_sensitivity
      ALLOWED_VALUES 'confidential', 'internal', 'public'
      PROPAGATE = ON_DEPENDENCY
      ON_CONFLICT = ALLOWED_VALUES_SEQUENCE;
    
    Copy

    如果此标签的值 internalpublic 之间存在冲突,则 data_sensitivity 标签的值将是 internal,因为它在允许值列表中排在 public 前面。

    请注意,如果您选择使用 ON_CONFLICT = ALLOWED_VALUES_SEQUENCE,更改 ALLOWED_VALUES 参数会影响冲突的解决方式。例如,如果您更改允许列表中值的顺序,则将来的冲突可能会导致为标签分配不同的值。

要跟踪与标签传播相关的冲突,请参阅 使用事件表监控标签传播

使用事件表监控标签传播

您可以使用 事件表 收集与标签传播相关的遥测数据。在 Snowflake 开始收集事件表中的数据后,您可以查询该表、创建流以跟踪更改,或者设置警报以在某些事件发生时发送通知。

如果您希望收集标签传播的遥测数据,必须启用 ENABLE_TAG_PROPAGATION_EVENT_LOGGING 账户参数。要开始收集数据,请运行以下命令:

ALTER ACCOUNT SET ENABLE_TAG_PROPAGATION_EVENT_LOGGING = TRUE;
Copy

如果您为该标签所在的数据库设置了事件表,则事件会记录到该表中。否则,事件会记录到默认事件表中。

了解事件

下表描述了事件表中与标签传播对应的值,便于您关注相关事件。有关事件表结构的详细信息,请参阅 事件表列

事件表列

列字段

字段值

描述

scope

name

snow.automatic_tag_propagation

表示该记录与自动标签传播相关。

record_attributes

tag_name

tag_name

在传播过程中发生事件的标签名称。

record_attributes

event_type

CONFLICT

表示在传播标签时发生了冲突。

record_attributes

event_type

TAG_PROPAGATION_LIMIT_EXCEEDED

表示由于目标对象超过 10,000 个,Snowflake 未传播该标签。

value

conflict_values

[tag_value, tag_value]

发生冲突的标签值数组。

value

resolution_type

DEFAULTSTRING_OVERRIDEALLOWED_VALUES_OVERRIDE

指示在发生冲突时 Snowflake 所采取的操作。要了解冲突为何以特定方式解决,请参阅 标签传播冲突

value

resolved_values

tag_value

Snowflake 解决冲突后标签的最终值。

使用以下示例可以更好地理解如何在事件表中识别标签传播事件。

查询:查找与标签 TAG1 传播相关的所有事件
SELECT
  TIMESTAMP as time,
  RECORD_ATTRIBUTES['event_type'] as event_type,
  VALUE as event_details
FROM tagging_db.tagging_schema.my_event_table
WHERE
  SCOPE['name'] = 'snow.automatic_tag_propagation'
  AND RECORD_ATTRIBUTES['tag_name'] = 'TAGGING_DB.TAGGING_SCHEMA.TAG1';
Copy
查询:查找在传播过程中发生冲突的所有标签
SELECT
  DISTINCT RECORD_ATTRIBUTES['tag_name'] as tags,
  VALUE['conflict_values'] as conflicting_tag_values,
  VALUE['resolution_type'] as resolution_type,
  VALUE['resolved_value'] as resolved_value,
FROM tagging_db.tagging_schema.my_event_table
WHERE
  SCOPE['name'] = 'snow.automatic_tag_propagation'
  AND RECORD_ATTRIBUTES['event_type'] = 'CONFLICT';
Copy
查询:查找在标签 TAG1 传播过程中发生冲突的实体
SELECT
  TIMESTAMP as time,
  RECORD_ATTRIBUTES['entity_name'] as entity_name,
  RECORD_ATTRIBUTES['entity_domain'] as entity_domain,
FROM tagging_db.tagging_schema.my_event_table
WHERE
  SCOPE['name'] = 'snow.automatic_tag_propagation'
  AND RECORD_ATTRIBUTES['tag_name'] = 'TAGGING_DB.TAGGING_SCHEMA.TAG1'
  AND RECORD_ATTRIBUTES['event_type'] = 'CONFLICT';
Copy

事件的严重性

仅当表的 LOG_LEVEL 参数 配置为显示该严重性级别的事件时,才会记录标签传播事件。使用下表确定标签传播事件的严重性级别。

事件类型

解决类型

严重性

CONFLICT

default

WARN

string_override

INFO

allowed_values_override

INFO

TAG_PROPAGATION_LIMIT_EXCEEDED

不适用

ERROR

受支持对象

以下对象类型支持从源到目标的标签传播:

  • 以下类型的表:

    • 动态表 – 出于标签传播的目的,创建动态表既被视为对象依赖关系,也被视为数据移动。

    • 外部表

    • Iceberg 表

    • 临时/瞬态表

  • 以下类型的视图:

    • 视图

    • 安全视图

    • 物化视图

限制和注意事项

  • 系统标签不会传播。

  • 继承的标签 不会传播。

  • 标签不会从共享传播到本地对象。

  • 对象上的标签数量不能超过 标准限制

  • 标签不能传播到超过 10,000 个目标对象。您可以 使用事件表 来查看传播是否因该原因失败。

  • 通过对对象依赖关系进行标签传播,可以将标签应用于源表和目标视图。如果标签与掩码策略关联,则重复执行该策略可能会产生相关后果。

语言: 中文