Auflösung des Objektnamens¶
Ein vollständig qualifiziertes Schemaobjekt (Tabelle, Ansicht, Dateiformat usw.) hat die Form:
<Datenbankname>.<Schemaname>.<Objektname>
Da es jedoch mühsam sein kann, dies zu schreiben, darf der Benutzer Qualifikationen von links nach rechts weglassen. Unter diesem Thema wird beschrieben, wie Schemaobjektnamen aufgelöst werden.
Unter diesem Thema:
Auflösung bei Weglassen der Datenbank¶
(''<Schemaname>.<Objektname>'')
Der Objektname wird um die aktuelle Datenbank erweitert. Die aktuelle Datenbank wird auf einen Standardwert gesetzt, abhängig von den Kontoeinstellungen, wenn eine Sitzung initiiert wird. Anschließend kann sie mit dem Befehl USE DATABASE geändert werden. Mit dem Befehl CREATE DATABASE wird auch die aktuelle Datenbank implizit in die neu erstellte Datenbank geändert. Der Name der aktuellen Datenbank wird von der Funktion CURRENT_DATABASE zurückgegeben.
Beispiel:
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 | --------------------+
Auflösung bei Weglassen des Schemas (Doppelpunktnotation)¶
(''<Datenbankname>..<Objektname>'')
Die beiden Punkte zeigen an, dass der Schemaname nicht angegeben ist. Auf das Standardschema PUBLIC wird immer verwiesen.
Beachten Sie, dass dieses Notationsformat hauptsächlich aus Gründen der Kompatibilität mit anderen Systemen bereitgestellt wird, z. B. Microsoft SQL Server und IBM Netezza. Eine Verwendung dieser Notation in neuen Abfragen ist nicht empfehlenswert.
Nicht qualifizierte Objekte¶
Nicht qualifizierte Objekte (einzelne Bezeichner) werden auf zwei verschiedene Arten aufgelöst, je nachdem, ob sie in einer DDL- oder DML-Anweisung oder in einer Abfrage erscheinen.
DDL- und DML-Anweisungen¶
In DDL- und DML-Anweisungen werden nicht qualifizierte Objekte um die aktuelle Datenbank und das aktuelle Schema erweitert. Das aktuelle Schema wird ähnlich wie die aktuelle Datenbank verwaltet. Das aktuelle Schema gehört immer zur aktuellen Datenbank.
Wenn eine Sitzung initiiert wird, wird das aktuelle Schema basierend auf den Einstellungen der Verbindung initialisiert. Wenn die aktuelle Datenbank geändert wird, verwendet das aktuelle Schema standardmäßig den Wert einer internen Eigenschaft (normalerweise auf PUBLIC gesetzt). Das aktuelle Schema kann (immer innerhalb der aktuellen Datenbank) mit dem Befehl USE SCHEMA geändert werden. Es wird auch implizit durch den Befehl CREATE SCHEMA geändert. Der Name des aktuellen Schemas wird von der Funktion CURRENT_SCHEMA zurückgegeben.
Beispiel:
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 | ------------------+
Namensauflösung in Abfragen¶
In Abfragen werden nicht qualifizierte Objektnamen über einen Suchpfad aufgelöst.
Der Suchpfad enthält normalerweise das aktuelle Schema, kann aber auch andere Schemas enthalten.
Der Suchpfad wird im Parameter SEARCH_PATH auf Sitzungsebene gespeichert. Ähnlich wie bei jedem anderen Parameter kann er mit dem Befehl ALTER SESSION geändert werden.
Der Wert des Suchpfads ist eine durch Kommas getrennte Liste von Bezeichnern. Die Liste kann vollständig oder teilweise qualifizierte Schemanamen enthalten. Jeder Schemaname kann ein Bezeichner mit doppelten Anführungszeichen sein.
Der Suchpfad kann auch die folgenden Pseudovariablen enthalten:
- $current
Gibt das aktuelle Schema an (siehe oben).
- $public
Gibt das öffentliche Schema der aktuellen Datenbank an. Der Name des öffentlichen Schemas wird durch eine interne Eigenschaft bestimmt, die von Snowflake verwaltet wird und normalerweise auf PUBLIC gesetzt wird (für das PUBLIC-Schema, das automatisch für jede Datenbank erstellt wird).
Bei diesen Pseudovariablennamen wird die Groß-/Kleinschreibung nicht berücksichtigt.
Der Standardwert des Suchpfads ist $current, $public
.
Wenn der Benutzer einen neuen Wert für den Suchpfad angibt, wird der neue Wert überprüft. Jeder im neuen Wert angegebene Schema-Bezeichner muss einem vorhandenen Schema entsprechen. (Insbesondere muss jedes nicht qualifizierte Schema einem in der aktuellen Datenbank vorhandenen Schema entsprechen.) Andernfalls wird ein Fehler ausgelöst, und search_path behält seinen vorherigen Wert bei. Die Pseudovariablen können jedoch frei verwendet werden. Zum Beispiel kann $public verwendet werden, auch wenn die aktuelle Datenbank kein öffentliches Schema hat.
Der Wert des Parameters SEARCH_PATH wird bei jeder Verwendung neu interpretiert. Daher wird durch Ändern des aktuellen Schemas die Bedeutung von $current
und durch Ändern der aktuellen Datenbank die Bedeutung von $public
sowie die Bedeutung aller nicht qualifizierten Schemas geändert.
Wenn ein Schema im Suchpfad gelöscht wird oder wenn die aktuelle Datenbank geändert wird und einige nicht qualifizierte Schemas im Suchpfad in der neuen Datenbank nicht vorhanden sind, wird kein Fehler ausgegeben.
Der SEARCH_PATH wird in Ansichten oder UDFs nicht verwendet. Alle nicht qualifizierten Objekte in einer Ansichts- oder UDF-Definition werden nur im Schema der Ansicht bzw. UDF aufgelöst.
Der Literalwert des Suchpfads kann mit dem Befehl SHOW PARAMETERS überprüft werden.
Verwenden Sie die Funktion CURRENT_SCHEMAS, um die Schemas anzuzeigen, die in Abfragen nach nicht qualifizierten Objekten durchsucht werden. Der Rückgabewert für die Funktion enthält eine Reihe vollqualifizierter Schemas im Suchpfad, die durch Kommas getrennt sind.
Beispiel:
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"] | +-----------------------------------------+
Die Pseudovariablen werden auf ihren aktuellen Wert erweitert, nicht qualifizierte Schemas sind voll qualifiziert, und Schemas, die nicht vorhanden oder sichtbar sind, werden weggelassen.
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] |
---------------------------------------------+