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 | ------------------+
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 Como escrever funções definidas pelo usuário (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] |
---------------------------------------------+