오브젝트 이름 확인¶
정규화된 스키마 오브젝트(테이블, 뷰, 파일 형식 등)는 다음 형식을 가집니다.
<데이터베이스_이름>.<스키마_이름>.<오브젝트_이름>
하지만 이런 형식으로 작성하기 귀찮을 수 있으므로, 사용자는 왼쪽에서 오른쪽으로 한정자를 생략해도 됩니다. 이 항목에서는 스키마 오브젝트 이름이 확인되는 방식을 설명합니다.
이 항목의 내용:
데이터베이스 생략 시의 확인¶
(''<스키마_이름>.<오브젝트_이름>'')
오브젝트 이름은 현재 데이터베이스와 함께 늘어납니다. 현재 데이터베이스는 세션이 시작될 때 계정의 설정에 따라 기본값으로 설정됩니다. 그 후에는 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 | --------------------+
스키마 생략 시의 확인(이중 점 표기법)¶
(''<데이터베이스_이름>..<오브젝트_이름>'')
두 점은 스키마 이름이 지정되지 않았음을 나타냅니다. 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 | ------------------+
쿼리의 이름 확인¶
쿼리에서 정규화되지 않은 오브젝트 이름은 검색 경로를 통해 확인됩니다.
검색 경로는 보통 현재 스키마를 포함하지만, 다른 스키마도 포함할 수 있습니다.
검색 경로는 세션 수준 매개 변수 SEARCH_PATH에 저장됩니다. 다른 매개 변수와 마찬가지로, ALTER SESSION 명령을 사용해 변경할 수 있습니다.
검색 경로의 값은 쉼표로 구분된 식별자 목록입니다. 이 목록은 완전 정규화되거나 부분적으로 정규화된 스키마 이름을 포함할 수 있습니다. 각 스키마 이름은 큰따옴표로 묶인 식별자 일 수 있습니다.
검색 경로는 다음 의사 변수도 포함할 수 있습니다.
- $current
현재 스키마를 지정합니다(위 내용 참조).
- $public
현재 데이터베이스의 공개 스키마를 지정합니다. (각 데이터베이스에 대해 자동으로 생성되는 PUBLIC 스키마의 경우) 공개 스키마의 이름은 일반적으로 PUBLIC으로 설정되고 Snowflake에서 유지 관리하는 내부 속성에 의해 결정됩니다.
이러한 의사 변수 이름은 대/소문자를 구분하지 않습니다.
검색 경로의 기본값은 $current, $public
입니다.
사용자가 검색 경로에 대해 새 값을 지정하면 새 값의 유효성이 검사됩니다. 새 값에 지정된 모든 스키마 식별자는 기존 스키마와 부합해야 합니다. (특히, 정규화되지 않은 모든 스키마는 현재 데이터베이스의 기존 스키마와 부합해야 함). 그렇지 않으면 오류가 발생하고 search_path는 이전 값을 유지합니다. 하지만 의사 변수를 자유롭게 사용할 수 있습니다. 예를 들어, 현재 데이터베이스에 공개 스키마가 없더라도 $public 을 사용할 수 있습니다.
SEARCH_PATH 매개 변수의 값은 사용될 때마다 다시 해석됩니다. 따라서 현재 스키마를 변경하면 $current
의 의미가 바뀌고, 현재 데이터베이스를 변경하면 $public
의 의미뿐 아니라 정규화되지 않은 스키마의 의미도 바뀝니다.
검색 경로의 스키마가 삭제되거나 현재 데이터베이스가 변경되고 검색 경로의 일부 정규화되지 않은 스키마가 새 데이터베이스에 존재하지 않는 경우 오류가 발생하지 않습니다.
SEARCH_PATH는 뷰 또는 UDF 내에서 사용되지 않습니다. 뷰 또는 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"] | +-----------------------------------------+
의사 변수는 현재 값으로 확장되고, 정규화되지 않은 스키마는 정규화되며, 존재하지 않거나 보이지 않는 스키마는 생략됩니다.
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] |
---------------------------------------------+