对象依赖关系

本主题提供有关对象依赖关系的概念以及与 Account Usage 视图 OBJECT_DEPENDENCIES 相关的信息。

什么是对象依赖关系?

对象依赖关系意味着,为了对对象进行操作,正在操作的对象必须引用自身的元数据或至少引用一个其他对象的元数据。Snowflake 在 Account Usage 视图 OBJECT_DEPENDENCIES 中跟踪对象依赖关系。

Snowflake 支持本地 Snowflak 账户中的对象依赖关系以及与数据共享相关的某些依赖关系,例如,通过提供商共享获取的表中,在使用者账户中创建视图。通过共享对象的依赖关系,数据主管能够确保更高的数据完整性,更全面地遵循每个监管标准,并生成更详细的影响分析。

Snowflake 支持以下可触发依赖关系的依赖关系类型:对象 name 值、对象 ID 值以及对象 name 值与对象 ID 值的组合。

BY_NAME:

当 SQL 语句指定对象本身的 name 值时(例如 CREATEALTER 命令),或者当一个对象调用另一个对象的 name 值(例如使用 FROM 子句)以完成 SQL 操作时,会产生 BY_NAME 依赖关系。

例如,请注意以下语句:

create view myview as select * from mytable;
Copy

namemytable 是表的元数据。名为 myview 的视图依赖于名为 mytable 的表;该表必须存在才能创建视图。

Snowflake 将名为 myview 的视图作为 引用的对象,将表 mytable 作为 受引用的对象

BY_ID:

当一个对象存储另一个对象的对象 ID 值时,会发生 BY_ID 依赖关系。ID 依赖关系的一个示例是用于对存储集成 OBJECT_ID 值进行存储的外部暂存区。目前,存储集成对象 ID 值只能由 Snowflake 访问,并且无法通过面向客户的 SQL 操作进行查看。

create stage my_ext_stage
  url='s3://load/files/'
  storage_integration = myint;
Copy

Snowflake 将名为 my_ext_stage 的外部暂存区作为 引用的对象,将名为 myint 的存储集成作为 受引用的对象

BY_NAME_AND_ID:

某些 Snowflake 对象(例如物化视图)依赖于对象 name 值和对象 ID 值。这些对象通常是用于替换现有对象的 CREATE OR REPLACE 语句或用于重命名对象的 ALTER 语句的结果。

有关更多信息,请参阅 Account Usage OBJECT_DEPENDENCIES 视图的“使用说明”章节。

支持的对象依赖关系

Snowflake 支持引用的对象和受引用的对象,如下所示:

引用的对象

受引用的对象

依赖关系类型

视图、安全视图、动态表、SQL UDF、SQL UDTF 以及按名称引用的其他对象

视图

安全视图

物化视图

动态表

UDF(各种)

UDTF

以及按名称引用的其他对象

BY_NAME

外部暂存区

存储集成

表、视图、安全视图

BY_ID

外部表

暂存区

BY_ID

物化视图

表、外部表

BY_NAME_AND_ID

请注意,Snowflake 在数据共享上下文中仅支持以下对象:

引用的对象

受引用的对象

依赖关系类型

视图、动态表、SQL UDF、SQL UDTF

安全视图

安全物化视图

动态表

安全 UDF 和安全 UDTF

BY_NAME

物化视图

BY_NAME_AND_ID

有关更多信息,请参阅 OBJECT_DEPENDENCIES 视图的“使用说明”章节。

优势

识别对象依赖关系,可以深入了解数据跟踪用例,如下所示:

影响分析:

通过了解对象依赖关系,数据管理员可以识别引用的对象和受引用的对象之间的关系,以确保受引用的对象的更新,不会对引用的对象的用户产生不利影响。

例如,表所有者计划向表中添加列。根据表名查询 OBJECT_DEPENDENCIES 视图,可返回所有会受影响的对象(例如视图)。

然后,数据管理员可以协调行动计划,以确保表和视图更新的时间不会导致任何中断的查询,这将对用户查询从表创建的视图产生不利影响。

合规:

对象依赖关系可帮助合规官识别敏感数据源(即受引用的对象)和数据目标(即引用的对象)之间的关系。然后,合规官可以根据合规性要求(例如 GDPR),决定如何更好地更新受引用的对象和引用的对象。

数据完整性:

对象依赖关系可帮助主要数据专业人员(如分析师、科学家、合规官和其他业务用户)确信数据来自可信赖的源。

限制

除了视图“使用说明”之外,在查询 OBJECT_DEPENDENCIES 视图时请注意以下限制:

会话参数:

Snowflake cannot accurately compute the dependencies of objects that include session parameters in their definitions because session parameters can take on different values depending on the context.

Snowflake 建议不要在视图和函数定义中使用会话变量。

Snowflake 实现:

此视图不会获取 Snowflake 实现所需的依赖关系。例如,该视图不会记录通过另一个表的克隆创建新表所需的依赖关系。

对象解析:

如果视图定义使用函数调用对象来创建视图,或者如果在其他函数或视图内调用对象,则 Snowflake 不会记录对象依赖关系。例如:

create or replace view v_on_stage_function
as
select *
from T1
where get_presigned_url(@stage1, 'data_0.csv.gz')
is not null;
Copy

在此示例中,函数 get_presigned_url 调用暂存区 stage1。Snowflake 不会记录以下依赖关系:名为 v_on_stage_function 的视图依赖于名为 stage1 的暂存区。

损坏的依赖关系:

如果依赖关系类型值为 BY_NAME_AND_ID,并且对象依赖关系由于为对象执行 CREATE OR REPLACE 或 ALTER 操作而更改,则 Snowflake 仅记录这些操作之前的对象依赖关系。

Snowflake 不会在执行这些操作后在视图查询结果中记录对象依赖关系,因为结果是损坏的引用。

具有 Snowflake 功能和服务的对象依赖关系

外部对象:

Snowflake 仅跟踪 Snowflake 对象的对象依赖关系。例如,如果 Snowflake 对象依赖于 Amazon S3 桶,则此视图不会记录对桶的依赖关系,因为该桶是 Amazon 对象,而不是 Snowflake 对象。

复制:

虽然辅助对象依赖于主对象,但此视图不会记录由于复制操作而导致的依赖关系。

数据共享:

对于提供商账户,此视图不允许数据共享提供商账户确定数据共享使用者账户中的依赖对象。例如,数据共享提供商创建视图并共享该视图。数据共享提供商无法使用此视图来确定使用者账户中通过共享视图创建的任何对象(例如新表或视图)。

对于使用者账户,此视图不允许数据共享使用者账户确定数据共享提供商账户中的依赖对象。例如,如果数据共享使用者账户使用由数据共享提供商账户提供的 UDF,则数据共享使用者无法使用此视图来标识共享的 UDF 所依赖的对象。

有关更多信息,请参阅 使用说明

查询 OBJECT_DEPENDENCIES 视图

以下示例涵盖以下用例:

  1. 显示依赖于外部表的对象。

  2. 影响分析:查找表所引用的对象。

  3. GDPR:查找给定视图的数据源。

  4. 数据共享。

显示依赖于外部表的对象

通过名为 sales_staging_table 的外部表,创建名为 sales_view 的物化视图:

CREATE OR REPLACE MATERIALIZED VIEW sales_view AS SELECT * FROM sales_staging_table;
Copy

在共享的 SNOWFLAKE 数据库的 Account Usage 架构中查询 OBJECT_DEPENDENCIES 视图。请注意,物化视图是 referencing_object_name,外部表是 referenced_object_domain

SELECT referencing_object_name, referencing_object_domain, referenced_object_name, referenced_object_domain
FROM snowflake.account_usage.object_dependencies
WHERE referenced_object_name = 'SALES_STAGING_TABLE' and referenced_object_domain = 'EXTERNAL TABLE';
Copy
+-------------------------+---------------------------+------------------------+--------------------------+
| REFERENCING_OBJECT_NAME | REFERENCING_OBJECT_DOMAIN | REFERENCED_OBJECT_NAME | REFERENCED_OBJECT_DOMAIN |
+-------------------------+---------------------------+------------------------+--------------------------+
| SALES_VIEW              | MATERIALIZED VIEW         | SALES_STAGING_TABLE    | EXTERNAL TABLE           |
+-------------------------+---------------------------+------------------------+--------------------------+

影响分析:查找表所引用的对象

请注意一个名为 SALES_NA 的基表,其中 NA 表示北美,US 表示美国,CAL 表示加利福尼亚,其中包含一系列嵌套视图:

  • (表) SALES_NA » (视图)``NORTH_AMERICA_SALES`` » (视图)``US_SALES``

  • (表) SALES_NA » (视图)``NORTH_AMERICA_SALES`` » (视图)``CAL_SALES``

要创建表和嵌套视图,请执行以下命令:

CREATE TABLE sales_na(product string);
CREATE OR REPLACE VIEW north_america_sales AS SELECT * FROM sales_na;
CREATE VIEW us_sales AS SELECT * FROM north_america_sales;
CREATE VIEW cal_sales AS SELECT * FROM north_america_sales;
Copy

同样,请注意基表 SALES_NA 与其嵌套视图的关系,并注意基表 SALES_UK (其中 UK 表示英国)与其嵌套视图的关系。

请注意,两个不同的视图用作源对象,以派生名为 GLOBAL_SALES 的视图:

  • (表) SALES_NA » (视图)``NORTH_AMERICA_SALES`` » (视图)``GLOBAL_SALES``

  • (表) SALES_UK » (视图)``GLOBAL_SALES``

要创建这些嵌套视图,请执行以下命令:

CREATE TABLE sales_uk (product string);
CREATE VIEW global_sales AS SELECT * FROM sales_uk UNION ALL SELECT * FROM north_america_sales;
Copy

在共享的 SNOWFLAKE 数据库的 Account Usage 架构中查询 OBJECT_DEPENDENCIES 视图,以确定表 SALES_NA 的对象引用。请注意查询结果中的第四行,它指定了表 SALES_NA,但不引用表 SALES_UK

WITH RECURSIVE referenced_cte
(object_name_path, referenced_object_name, referenced_object_domain, referencing_object_domain, referencing_object_name, referenced_object_id, referencing_object_id)
    AS
      (
        SELECT referenced_object_name || '-->' || referencing_object_name as object_name_path,
               referenced_object_name, referenced_object_domain, referencing_object_domain, referencing_object_name, referenced_object_id, referencing_object_id
          FROM snowflake.account_usage.object_dependencies referencing
          WHERE true
            AND referenced_object_name = 'SALES_NA' AND referenced_object_domain='TABLE'

        UNION ALL

        SELECT object_name_path || '-->' || referencing.referencing_object_name,
              referencing.referenced_object_name, referencing.referenced_object_domain, referencing.referencing_object_domain, referencing.referencing_object_name,
              referencing.referenced_object_id, referencing.referencing_object_id
          FROM snowflake.account_usage.object_dependencies referencing JOIN referenced_cte
            ON referencing.referenced_object_id = referenced_cte.referencing_object_id
            AND referencing.referenced_object_domain = referenced_cte.referencing_object_domain
      )

  SELECT object_name_path, referenced_object_name, referenced_object_domain, referencing_object_name, referencing_object_domain
    FROM referenced_cte
;
Copy
+-----------------------------------------------+------------------------+--------------------------+-------------------------+---------------------------+
| OBJECT_NAME_PATH                              | REFERENCED_OBJECT_NAME | REFERENCED_OBJECT_DOMAIN | REFERENCING_OBJECT_NAME | REFERENCING_OBJECT_DOMAIN |
+-----------------------------------------------+------------------------+--------------------------+-------------------------+---------------------------+
| SALES_NA-->NORTH_AMERICA_SALES                | SALES_NA               | TABLE                    | NORTH_AMERICA_SALES     | VIEW                      |
| SALES_NA-->NORTH_AMERICA_SALES-->CAL_SALES    | NORTH_AMERICA_SALES    | VIEW                     | CAL_SALES               | VIEW                      |
| SALES_NA-->NORTH_AMERICA_SALES-->US_SALES     | NORTH_AMERICA_SALES    | VIEW                     | US_SALES                | VIEW                      |
| SALES_NA-->NORTH_AMERICA_SALES-->GLOBAL_SALES | NORTH_AMERICA_SALES    | VIEW                     | GLOBAL_SALES            | VIEW                      |
+-----------------------------------------------+------------------------+--------------------------+-------------------------+---------------------------+

GDPR:查找给定视图的数据源

可以从许多不同的源对象创建派生对象(例如视图、CTAS),以提供自定义视图或仪表板。为满足 GDPR 等监管要求,合规官和审计员需要能够将数据从给定对象跟踪到其原始数据源。

例如,视图 GLOBAL_SALES 派生自指向两个不同基表的两个不同依赖路径:

  • (表) SALES_NA » (视图)``NORTH_AMERICA_SALES`` » (视图)``GLOBAL_SALES``

  • (表) SALES_UK » (视图)``GLOBAL_SALES``

要创建这些嵌套视图,请执行以下命令:

CREATE TABLE sales_na (product string);
CREATE OR REPLACE VIEW north_america_sales AS SELECT * FROM sales_na;
CREATE TABLE sales_uk (product string);
CREATE VIEW global_sales AS SELECT * FROM sales_uk UNION ALL SELECT * FROM north_america_sales;
Copy

在共享的 SNOWFLAKE 数据库的 Account Usage 架构中查询 OBJECT_DEPENDENCIES 视图,以查找视图 GLOBAL_SALES 的数据源。查询结果中的每一行都指定了指向唯一对象的依赖路径。

WITH RECURSIVE referenced_cte
(object_name_path, referenced_object_name, referenced_object_domain, referencing_object_domain, referencing_object_name, referenced_object_id, referencing_object_id)
    AS
      (
        SELECT referenced_object_name || '<--' || referencing_object_name AS object_name_path,
               referenced_object_name, referenced_object_domain, referencing_object_domain, referencing_object_name, referenced_object_id, referencing_object_id
          from snowflake.account_usage.object_dependencies referencing
          WHERE true
            AND referencing_object_name = 'GLOBAL_SALES' and referencing_object_domain='VIEW'

        UNION ALL

        SELECT referencing.referenced_object_name || '<--' || object_name_path,
              referencing.referenced_object_name, referencing.referenced_object_domain, referencing.referencing_object_domain, referencing.referencing_object_name,
              referencing.referenced_object_id, referencing.referencing_object_id
          FROM snowflake.account_usage.object_dependencies referencing JOIN referenced_cte
            ON referencing.referencing_object_id = referenced_cte.referenced_object_id
            AND referencing.referencing_object_domain = referenced_cte.referenced_object_domain
      )

  SELECT object_name_path, referencing_object_name, referencing_object_domain, referenced_object_name, referenced_object_domain
    FROM referenced_cte
;
Copy
+-----------------------------------------------+-------------------------+---------------------------+------------------------+--------------------------+
| OBJECT_NAME_PATH                              | REFERENCING_OBJECT_NAME | REFERENCING_OBJECT_DOMAIN | REFERENCED_OBJECT_NAME | REFERENCED_OBJECT_DOMAIN |
+-----------------------------------------------+-------------------------+---------------------------+------------------------+--------------------------+
| SALES_UK<--GLOBAL_SALES                       | GLOBAL_SALES            | VIEW                      | SALES_UK               | TABLE                    |
| NORTH_AMERICA_SALES<--GLOBAL_SALES            | GLOBAL_SALES            | VIEW                      | NORTH_AMERICA_SALES    | VIEW                     |
| SALES_NA<--NORTH_AMERICA_SALES<--GLOBAL_SALES | NORTH_AMERICA_SALES     | VIEW                      | SALES_NA               | TABLE                    |
+-----------------------------------------------+-------------------------+---------------------------+------------------------+--------------------------+

数据共享

请注意下表,该表摘自使用者账户中的 OBJECT_DEPENDENCIES 视图,其中:

  • V1 指定使用者从共享对象创建的视图。

  • S_V1 指定提供商共享的视图。

  • S_T1 指定提供商共享的表。

REFERENCING_OBJECT_NAME

REFERENCED_OBJECT_NAME

REFERENCED_OBJECT_DOMAIN

REFERENCED_OBJECT_ID

1

V1

S_V1

TABLE

NULL

2

V1

S_T1

TABLE

NULL

根据此表,请注意以下几点:

  • 如果提供商从共享中 撤销 S_T1,只要在撤销之前未重命名 S_T1,使用者就会继续在其本地视图中看到指定 S_T1 (第 2 行)的行。

  • 如果提供商在其账户中删除了某个表或视图,则该表或视图将不再包含在共享中。本地使用者视图会保留已删除的表或视图的现有记录,因为该表或视图是在提供商账户中的删除操作之前共享的。

    使用者无法观察提供商账户中的视图更改。

语言: 中文