Résolution de nom d’objet

Un objet de schéma complet (table, vue, format de fichier, etc.) a la forme :

<nom_base_de_données>.<nom_schéma>.<nom_objet>

Cependant, comme cela peut être fastidieux à écrire, l’utilisateur est autorisé à omettre des qualifications, de gauche à droite. Ce chapitre décrit comment les noms d’objet de schéma sont résolus.

Dans ce chapitre :

Résolution en cas d’omission de la base de données

(''<nom_schéma>.<nom_objet>'')

Le nom de l’objet est complété par la base de données actuelle. La base de données actuelle est définie sur une valeur par défaut, en fonction des paramètres du compte, lorsqu’une session est lancée. Ensuite, elle peut être modifié à l’aide de la commande USE DATABASE. La commande CREATE DATABASE transforme aussi implicitement la base de données courante en une nouvelle base de données créée. Le nom de la base de données courante est renvoyé par la fonction CURRENT_DATABASE.

Par exemple :

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

Résolution en cas d’omission d’un schéma (notation double point)

(''<nom_base_de_données>..<nom_objet>'')

Les deux points indiquent que le nom du schéma n’est pas spécifié. Le schéma par défaut PUBLIC est toujours référencé.

Notez que ce format de notation est fourni principalement pour la compatibilité avec d’autres systèmes, tels que Microsoft SQL Server et IBM Netezza. L’utilisation de cette notation dans les nouvelles requêtes est déconseillée.

Objets non qualifiés

Les objets non qualifiés (identificateurs uniques) sont résolus de deux manières différentes, selon qu’ils apparaissent dans une instruction DDL ou DML ou dans une requête.

Instructions DDL et DML

Dans des instructions DDL et DML, les objets non qualifiés sont augmentés avec la base de données et le schéma courants. Le schéma actuel est géré de la même manière que la base de données actuelle. Le schéma actuel appartient toujours à la base de données actuelle.

Lorsqu’une session est lancée, le schéma actuel est initialisé en fonction des paramètres de la connexion. Lorsque la base de données courante est modifiée, le schéma courant prend par défaut la valeur d’une propriété interne (normalement définie sur PUBLIC). Le schéma courant peut être modifié (toujours dans la base de données courante) en utilisant la commande USE SCHEMA. Il est aussi implicitement modifié par la commande CREATE SCHEMA. Le nom du schéma courant est renvoyé par la fonction CURRENT_SCHEMA.

Par exemple :

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

Résolution des noms dans les requêtes

Dans les requêtes, les noms d’objets non qualifiés sont résolus par le biais d’un chemin de recherche.

Le chemin de recherche contient généralement le schéma actuel, mais peut également contenir d’autres schémas.

Le chemin de recherche est stocké dans le paramètre SEARCH_PATH au niveau de la session. Semblable à tout autre paramètre, il peut être modifié à l’aide de la commande ALTER SESSION.

La valeur du chemin de recherche est une liste d’identificateurs séparés par des virgules. La liste peut contenir des noms de schéma entièrement ou partiellement qualifiés. Chaque nom de schéma peut être un Identificateurs entre guillemets doubles.

Le chemin de recherche peut également contenir les pseudo-variables suivantes :

$current

Spécifie le schéma actuel (voir ci-dessus).

$public

Spécifie le schéma public de la base de données actuelle. Le nom du schéma public est déterminé par une propriété interne, maintenue par Snowflake, qui est généralement définie sur PUBLIC (pour le schéma PUBLIC automatiquement créé pour chaque base de données).

Ces noms de pseudo-variables ne font pas la distinction entre les majuscules et les minuscules.

La valeur par défaut du chemin de recherche est $current, $public.

Si l’utilisateur spécifie une nouvelle valeur pour le chemin de recherche, la nouvelle valeur sera validée. Chaque identificateur de schéma spécifié dans la nouvelle valeur doit correspondre à un schéma existant. (En particulier, chaque schéma non qualifié doit correspondre à un schéma existant dans la base de données actuelle). Sinon, une erreur sera générée et search_path conservera sa valeur précédente. Cependant, les pseudo-variables peuvent être utilisées librement. Par exemple, $public peut être utilisé même si la base de données actuelle n’a pas de schéma public.

La valeur du paramètre SEARCH_PATH est réinterprétée à chaque utilisation. Par conséquent, la modification du schéma actuel modifie la signification de $current et la modification de la base de données actuelle modifie la signification de $public, ainsi que la signification des schémas non qualifiés.

Si un schéma du chemin de recherche est détruit ou si la base de données actuelle est modifiée et que certains schémas non qualifiés du chemin de recherche n’existent pas dans la nouvelle base de données, aucune erreur n’est générée.

Le SEARCH_PATH n’est pas utilisé dans les vues ou UDFs. Tous les objets non qualifiés d’une vue ou une définition d’UDF seront résolus dans le schéma de la vue ou de l’UDF uniquement.

La valeur littérale du chemin de recherche peut être examinée à l’aide de la commande SHOW PARAMETERS.

Pour voir les schémas qui seront recherchés pour des objets non qualifiés dans des requêtes, utilisez la fonction CURRENT_SCHEMAS. La valeur de retour de la fonction contient une série de schémas complets dans le chemin de recherche, séparés par des virgules.

Par exemple :

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

Les pseudo-variables sont développées à leur valeur actuelle, les schémas non qualifiés sont pleinement qualifiés et les schémas qui n’existent pas ou qui ne sont pas visibles sont omis.

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