对象名称解析

完全限定的架构对象(表、视图、文件格式等)的形式如下:

<database_name>.<schema_name>.<object_name>

但由于编写起来可能相当繁琐,因此允许用户按照从左到右的顺序忽略限定条件。本主题介绍如何解析架构对象名称。

本主题内容:

忽略数据库时的解决方法

(''<schema_name>.<object_name>'')

对象名称将使用当前数据库进行扩充。启动会话时,当前数据库将设置为默认值,具体取决于账户设置。之后可使用 USE DATABASE 命令进行更改。CREATE DATABASE 命令还会将当前数据库隐式更改为新创建的数据库。CURRENT_DATABASE 函数返回当前数据库的名称。

例如:

SELECT CURRENT_DATABASE();

--------------------+
 CURRENT_DATABASE() |
--------------------+
 TESTDB             |
--------------------+

CREATE DATABASE db1;

------------------------------------+
               status               |
------------------------------------+
 Database DB1 successfully created. |
------------------------------------+

SELECT CURRENT_DATABASE();

--------------------+
 CURRENT_DATABASE() |
--------------------+
 DB1                |
--------------------+

USE DATABASE testdb;

----------------------------------+
              status              |
----------------------------------+
 Statement executed successfully. |
----------------------------------+

SELECT current_database();

--------------------+
 CURRENT_DATABASE() |
--------------------+
 TESTDB             |
--------------------+
Copy

忽略架构时的解决方法(双点表示法)

(''<database_name>..<object_name>'')

这两个点表示未指定架构名称。始终引用 PUBLIC 默认架构。

请注意,提供此符号格式的主要目的是兼容其他系统(如 Microsoft SQL Server 和 IBM Netezza)。不建议在新查询中使用这种表示法。

非限定对象

非限定对象(单个标识符)以两种不同的方式解析,具体取决于它们是出现在 DDL 或 DML 语句中,还是出现在查询中。

DDL 和 DML 语句

在 DDL 和 DML 语句中,非限定对象使用当前数据库和架构扩充。当前架构的维护方式类似于当前数据库。当前架构始终属于当前数据库。

启动会话时,将根据连接的设置初始化当前架构。更改当前数据库时,当前架构默认为一个内部属性的值(通常设置为 PUBLIC)。可以使用 USE SCHEMA 命令更改当前架构(但始终在当前数据库中)。也可通过 CREATE SCHEMA 命令隐式对此进行更改。CURRENT_SCHEMA 函数返回当前架构的名称。

例如:

SELECT current_schema();

------------------+
 CURRENT_SCHEMA() |
------------------+
 TESTSCHEMA       |
------------------+

CREATE DATABASE db1;

------------------------------------+
               status               |
------------------------------------+
 Database DB1 successfully created. |
------------------------------------+

SELECT current_schema();

------------------+
 CURRENT_SCHEMA() |
------------------+
 PUBLIC           |
------------------+

CREATE SCHEMA sch1;

-----------------------------------+
              status               |
-----------------------------------+
 Schema SCH1 successfully created. |
-----------------------------------+

SELECT current_schema();

------------------+
 CURRENT_SCHEMA() |
------------------+
 SCH1             |
------------------+

USE SCHEMA public;

----------------------------------+
              status              |
----------------------------------+
 Statement executed successfully. |
----------------------------------+

SELECT current_schema();

------------------+
 CURRENT_SCHEMA() |
------------------+
 PUBLIC           |
------------------+
Copy

查询中的名称解析

在查询中,非限定对象名称通过搜索路径进行解析。

搜索路径通常包含当前架构,但也可包含其他架构。

搜索路径存储在会话级参数 SEARCH_PATH 中。与任何其他参数类似,可使用 ALTER SESSION 命令更改此参数。

搜索路径的值是使用逗号分隔的标识符列表。该列表可以包含完全限定或部分限定的架构名称。每个架构名称都可以是 加双引号的标识符

搜索路径还可以包含以下伪变量:

$current

指定当前架构(请参见上文)。

$public

指定当前数据库的公共架构。公共架构的名称由 Snowflake 维护的内部属性确定,该属性通常设置为 PUBLIC (针对为每个数据库自动创建的 PUBLIC 架构)。

这些伪变量的名称不区分大小写。

搜索路径的默认值为 $current, $public

如果用户为搜索路径指定了新值,则验证新值。新值中指定的每个架构标识符都必须对应于一个现有架构。(具体而言,每个非限定架构都必须对应于当前数据库中的一个现有架构)。否则将引发错误,search_path 将保留其先前的值。但伪变量可以自由使用。例如,即使当前数据库没有公共架构,也可使用 $public

每次使用 SEARCH_PATH 参数时,系统都会重新解析该参数的值。因此,更改当前架构会更改 $current 的含义,更改当前数据库会更改 $public 的含义以及任何非限定模式的含义。

如果删除了搜索路径中的架构,或更改了当前数据库,并且新数据库中不存在搜索路径中的某些非限定架构,则不会引发错误。

SEARCH_PATH 未在 视图UDFs 内使用。视图或 UDF 定义中的所有非限定对象均 在视图或 UDF 的架构中解析。

可以通过 SHOW PARAMETERS 命令来检查搜索路径的字面量值。

若要查看将为查询中的非限定对象搜索的架构,请使用 CURRENT_SCHEMAS 函数。该函数的返回值会包含搜索路径中的一系列完全限定架构,架构之间使用逗号分隔。

例如:

select current_schemas();

+-------------------+
| CURRENT_SCHEMAS() |
|-------------------|
| []                |
+-------------------+

use database mytestdb;

select current_schemas();

+---------------------+
| CURRENT_SCHEMAS()   |
|---------------------|
| ["MYTESTDB.PUBLIC"] |
+---------------------+

create schema private;

select current_schemas();

+-----------------------------------------+
| CURRENT_SCHEMAS()                       |
|-----------------------------------------|
| ["MYTESTDB.PRIVATE", "MYTESTDB.PUBLIC"] |
+-----------------------------------------+
Copy

伪变量将扩展到其当前值,非限定架构将变为完全限定形式,而不存在或不可见的架构将被忽略。

SHOW PARAMETERS LIKE 'search_path';

-------------+--------------------+--------------------+------------------------------------------------+
     key     |           value    |          default   |                  description                   |
-------------+--------------------+--------------------+------------------------------------------------+
 SEARCH_PATH | $current, $public, | $current, $public, | Search path for unqualified object references. |
-------------+--------------------+--------------------+------------------------------------------------+

SELECT current_schemas();

---------------------------------------------------------------------------+
                       CURRENT_SCHEMAS()                                   |
---------------------------------------------------------------------------+
 [XY12345.TESTDB.TESTSCHEMA, XY12345.TESTDB.PUBLIC, SAMPLES.COMMON.PUBLIC] |
---------------------------------------------------------------------------+

CREATE DATABASE db1;

------------------------------------+
               status               |
------------------------------------+
 Database DB1 successfully created. |
------------------------------------+

USE SCHEMA public;

----------------------------------+
              status              |
----------------------------------+
 Statement executed successfully. |
----------------------------------+

SELECT current_schemas();

---------------------------------------------+
                CURRENT_SCHEMAS()            |
---------------------------------------------+
 [XY12345.DB1.PUBLIC, SAMPLES.COMMON.PUBLIC] |
---------------------------------------------+

ALTER SESSION SET search_path='$current, $public, testdb.public';

----------------------------------+
              status              |
----------------------------------+
 Statement executed successfully. |
----------------------------------+

SHOW PARAMETERS LIKE 'search_path';

-------------+----------------------------------+--------------------+------------------------------------------------+
     key     |              value               |          default   |                  description                   |
-------------+----------------------------------+--------------------+------------------------------------------------+
 SEARCH_PATH | $current, $public, testdb.public | $current, $public, | Search path for unqualified object references. |
-------------+----------------------------------+--------------------+------------------------------------------------+

SELECT current_schemas();

---------------------------------------------+
            CURRENT_SCHEMAS()                |
---------------------------------------------+
 [XY12345.DB1.PUBLIC, XY12345.TESTDB.PUBLIC] |
---------------------------------------------+
Copy
语言: 中文