【问题标题】:Is it possible to run a snowflake sql script without qualifying the database name.?是否可以在不限定数据库名称的情况下运行雪花 sql 脚本。?
【发布时间】:2020-04-06 14:52:09
【问题描述】:

是否可以在不限定数据库名称的情况下运行 SQL 脚本? 目前,我们正在使用如下程序,

    SELECT  I.XXXX_LOC_SKEY,
            C.COUNTRY_SKEY
    FROM
            DEV_XXXX_DB.STAGING.XX_TABLE_LOCATION_SALES         F,
            DEV_XXXX_PRESENTATION_DB.DIMS.XXXX_LOCATIONS_D      I,
            DEV_XXXX_PRESENTATION_DB.DIMS.COUNTRY_D             C,
            DEV_XXXX_PRESENTATION_DB.DIMS.XXXX_DAILY_CALENDAR_D H
    WHERE
            F.STORE_CODE       = I.DOOR
    AND     I.CHANNEL          = 'XXXX'
    AND     F.COUNTRY          = C.COUNTRY_CODE
    AND     I.COUNTRY_SKEY     = C.COUNTRY_SKEY
    AND     F.DATE = H.DATE;

我们想运行相同的脚本,但不提及下面的数据库名称。

    SELECT  I.XXXX_LOC_SKEY,
            C.COUNTRY_SKEY
    FROM
            STAGING.XX_TABLE_LOCATION_SALES         F,
            DIMS.XXXX_LOCATIONS_D                   I,
            DIMS.COUNTRY_D                          C,
            DIMS.XXXX_DAILY_CALENDAR_D              H
    WHERE
            F.STORE_CODE       = I.DOOR
    AND     I.CHANNEL          = 'XXXX'
    AND     F.COUNTRY          = C.COUNTRY_CODE
    AND     I.COUNTRY_SKEY     = C.COUNTRY_SKEY
    AND     F.DATE = H.DATE;

【问题讨论】:

    标签: snowflake-cloud-data-platform snowflake-schema


    【解决方案1】:

    我可以看到您的 SQL 访问来自不同数据库的数据,然后您使用对象的完全限定名称运行 SQL。

    如果雪花当前会话指向对象的位置,那么您可以在不限定数据库名称的情况下运行 SQL。

    【讨论】:

    • Snowflake 一次只能指向一个数据库位置,My SQL 脚本有多个数据库和模式。在这种情况下,我们如何运行脚本。让我知道更多所需的信息。
    • @Unnikrish 使用完全限定的表名来运行 SQL。当您的 SQL 从不同数据库中的不同表访问数据时,您必须使用完全限定名称。
    • 由于您指的是不同的数据库,因此您需要完全限定所有数据库,但当前会话指向的数据库除外。实际上没有任何其他方法可以做到这一点,因为您可以在不同的数据库中拥有相同的架构名称,这意味着您的查询将是不明确的
    【解决方案2】:

    如果您有许多数据库,但大部分数据来自其中一个,您可以在一个数据库中创建指向另一个数据库的视图。这样就可以在不需要数据库的情况下查询所有对象。

    即CREATE VIEW MY_VIEW as SELECT * FROM DATABASE.SCHEMA.TABLE

    【讨论】:

      【解决方案3】:

      这是不合格对象的解析方式:

      https://docs.snowflake.net/manuals/sql-reference/name-resolution.html

      请注意,您可以自定义 SEARCH_PATH 以搜索多个架构。

      或者,您可以将完全限定的名称放在变量中:

      set f = 'DEV_XXXX_DB.STAGING.XX_TABLE_LOCATION_SALES';
      
      select f.* from table($f) f;
      
      select f.* from identifier($f) f;
      

      【讨论】:

        【解决方案4】:

        根据提供的 SQL 进行一些推断,您已将环境嵌入到数据库名称 (DEV_XXXX_DB) 中。由于每个环境有多个数据库,这迫使您将数据库名称显式添加到 SimonD 指出的每个跨数据库的 sql 中。

        如果您还没有发现这一点,那么您将很难在 b/c 环境之间推广代码,因为您必须将 DEV_XXXX_DB 替换为 PRD_XXXX_DB。

        如果您在 Snowflake 实施的过程中还没有走得太远,我建议您重新考虑您的 DB.SCHEMA 策略,并为每个环境 (env_XXXX_DB) 创建 1 个 DB,并将所有架构与该 DB (env_XXXX_DB) 一起放入.STAGING,env_XXXX_DB.DIMS)。

        【讨论】:

        • 这具有能够利用 DEFAULT_NAMESPACE 和 USE DATABASE 功能的额外好处。它还与围绕雪花生态系统的所有工具很好地对齐,因为它们通常需要在初始连接中指定的数据库。例如,我进一步隔离了我的 ELT 工具 DEV 与 PRD,以便 ELT DEV 仅连接到 Snowflake DEV_XXXX_DB 等。
        【解决方案5】:

        虽然雪花 Web GUI 会记住您的最后一个数据库,以及其他例如。 ETL 工具可以为连接配置默认数据库,Snowflake 没有默认数据库的概念。包括Web GUI在内的所有工具都必须发出以下命令来根据工具配置设置数据库:

        USE DATABASE db_name;
        

        如果您想避免在命令中引用数据库,则必须在会话中预先使用USE DATABASE 命令。

        【讨论】:

        • 您可以为用户指定的default_namespace 属性允许您使用任何工具登录,而无需使用use database db_name;。我认为工具本身也不使用它来执行use database 命令?
        猜你喜欢
        • 1970-01-01
        • 2011-06-15
        • 2012-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-10
        • 1970-01-01
        相关资源
        最近更新 更多