Resolução de nomes de objetos¶
Um objeto de esquema totalmente qualificado (tabela, exibição, formato de arquivo etc.) tem a forma:
<database_name>.<schema_name>.<object_name>
Entretanto, como pode ser tedioso escrever isso, o usuário pode omitir qualificações, da esquerda para a direita. Este tópico descreve como os nomes dos objetos de esquema são resolvidos.
Neste tópico:
Resolução quando o banco de dados é omitido¶
(''<schema_name>.<object_name>'')
O nome do objeto é aumentado com o banco de dados atual. O banco de dados atual é definido para um valor padrão, dependendo das configurações da conta, quando uma sessão é iniciada. Em seguida, pode ser alterado usando o comando USE DATABASE. O comando CREATE DATABASE também altera implicitamente o banco de dados atual para o recém-criado. O nome do banco de dados atual é retornado pela função CURRENT_DATABASE.
Por exemplo:
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 | --------------------+
Resolução em caso de omissão de esquema (notação de ponto duplo)¶
(''<database_name>..<object_name>'')
Os dois pontos indicam que o nome do esquema não está especificado. O esquema padrão PUBLIC é sempre referenciado.
Note que esse formato notacional é fornecido principalmente para compatibilidade com outros sistemas, como Microsoft SQL Server e IBM Netezza. O uso desta notação em novas consultas não é recomendável.
Objetos não qualificados¶
Objetos não qualificados (identificadores únicos) são resolvidos de duas maneiras diferentes, dependendo do caso: se aparecem em uma instrução DDL ou DML, ou em uma consulta.
Instruções DDL e DML¶
Nas instruções DDL e DML, os objetos não qualificados são aumentados com o banco de dados e esquema atual. O esquema atual é mantido de forma similar ao atual banco de dados. O esquema atual pertence sempre ao banco de dados atual.
Quando uma sessão é iniciada, o esquema atual é inicializado com base nas configurações da conexão. Quando o banco de dados atual é alterado, o esquema atual usa o padrão de valor de uma propriedade interna (normalmente definido como PUBLIC). O esquema atual pode ser alterado (sempre dentro do banco de dados atual) usando o comando USE SCHEMA. Também é implicitamente alterado pelo comando CREATE SCHEMA. O nome do esquema atual é retornado pela função CURRENT_SCHEMA.
Por exemplo:
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 | ------------------+
Resolução de nomes em consultas¶
Nas consultas, nomes de objetos não qualificados são resolvidos por meio de um caminho de pesquisa.
O caminho de pesquisa geralmente contém o esquema atual, mas também pode conter outros esquemas.
O caminho de pesquisa é armazenado no parâmetro de nível de sessão SEARCH_PATH. Similar a qualquer outro parâmetro, ele pode ser alterado usando o comando ALTER SESSION.
O valor do caminho de pesquisa é uma lista de identificadores separados por vírgulas. A lista pode conter nomes de esquemas total ou parcialmente qualificados. Cada nome de esquema pode ser um Identificadores entre aspas duplas.
O caminho de pesquisa também pode conter as seguintes pseudovariáveis:
- $current
Especifica o esquema atual (veja acima).
- $public
Especifica o esquema público do banco de dados atual. O nome do esquema público é determinado por uma propriedade interna, mantida pelo Snowflake, que normalmente é definida como PUBLIC (para o esquema PUBLIC criado automaticamente para cada banco de dados).
Esses nomes pseudovariáveis na diferenciam maiúsculas e minúsculas.
O valor padrão do caminho de pesquisa é $current, $public
.
Se o usuário especificar um novo valor para o caminho de pesquisa, o novo valor será validado. Cada identificador de esquema especificado no novo valor deve corresponder a um esquema existente. (Em especial, todo esquema não qualificado deve corresponder a um esquema existente no banco de dados atual). Caso contrário, um erro será levantado e search_path manterá seu valor anterior. Entretanto, as pseudovariáveis podem ser usadas livremente. Por exemplo, $public pode ser usado mesmo que o banco de dados atual não tenha um esquema público.
O valor do parâmetro SEARCH_PATH é reinterpretado toda vez que ele é utilizado. Portanto, alterar o esquema atual muda o significado de $current
, e alterar o banco de dados atual muda o significado de $public
, assim como o significado de quaisquer esquemas não qualificados.
Se um esquema no caminho de pesquisa for descartado, ou se o banco de dados atual for alterado e alguns esquemas não qualificados no caminho de pesquisa não existirem no novo banco de dados, nenhum erro será levantado.
O SEARCH_PATH não é usado dentro das exibições ou UDFs. Todos os objetos não qualificados em uma definição de exibição ou UDF serão resolvidos somente no esquema da exibição ou da UDF.
O valor do literal do caminho de pesquisa pode ser examinado com o comando SHOW PARAMETERS.
Para ver os esquemas que serão pesquisados para objetos não qualificados nas consultas, use a função CURRENT_SCHEMAS. O valor de retorno para a função contém uma série de esquemas totalmente qualificados no caminho de pesquisa, separados por vírgulas.
Por exemplo:
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"] | +-----------------------------------------+
As pseudovariáveis são expandidas para seu valor atual, os esquemas não qualificados são totalmente qualificados, e os esquemas que não existem ou não são visíveis são omitidos.
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] |
---------------------------------------------+