CREATE FUNCTION(Snowpark Container Services)¶
서비스 함수 를 만듭니다.
구문¶
CREATE [ OR REPLACE ] FUNCTION <name> ( [ <arg_name> <arg_data_type> ] [ , ... ] )
RETURNS <result_data_type>
[ [ NOT ] NULL ]
[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
[ { VOLATILE | IMMUTABLE } ]
SERVICE = <service_name>
ENDPOINT = <endpoint_name>
[ COMMENT = '<string_literal>' ]
[ CONTEXT_HEADERS = ( <context_function_1> [ , <context_function_2> ...] ) ]
[ MAX_BATCH_ROWS = <integer> ]
AS '<http_path_to_request_handler>'
필수 매개 변수¶
name
함수에 대한 식별자(
name
) 및 입력 인자를 지정합니다.함수는 이름과 인자 타입의 조합으로 식별 및 확인 되기 때문에 식별자는 함수가 생성되는 스키마에 대해 고유할 필요가 없습니다.
식별자는 알파벳 문자로 시작해야 하며 전체 식별자 문자열을 큰따옴표(예: “My object”)로 묶지 않는 한 공백이나 특수 문자를 포함할 수 없습니다. 큰따옴표로 묶인 식별자도 대/소문자를 구분합니다. 식별자 요구 사항 섹션을 참조하십시오.
( [ arg_name arg_data_type ] [ , ... ] )
서비스 함수에 대한 인자/입력값을 지정합니다. 이는 서비스가 예상하는 인자와 일치해야 합니다.
인자가 없으면 인자 이름과 데이터 타입 없이 괄호를 포함하십시오.
RETURNS result_data_type
함수에서 반환된 결과의 데이터 타입을 지정합니다.
SERVICE = service_name
Snowpark Container Services 서비스의 이름을 지정합니다.
ENDPOINT = endpoint_name
서비스 사양에 정의된 대로 엔드포인트의 이름을 지정합니다.
AS http_path_to_request_handler
함수 호출 시 실행되는 서비스 코드의 HTTP 경로를 지정합니다.
선택적 매개 변수¶
[ [ NOT ] NULL ]
함수가 NULL 값을 반환할 수 있거나 NON-NULL 값만 반환해야 할지 여부를 지정합니다. 기본값은 NULL입니다(즉, 이 함수는 NULL을 반환할 수 있음).
CALLED ON NULL INPUT
또는 .{ RETURNS NULL ON NULL INPUT | STRICT }
null 입력으로 호출 시 함수의 동작을 지정합니다. 입력값이 null일 때 항상 null을 반환하는 시스템 정의 함수와는 반대로, 함수는 null 입력을 처리하여 입력값이 null일 때도 null이 아닌 값을 반환할 수 있습니다.
CALLED ON NULL INPUT
은 항상 null 입력으로 함수를 호출합니다. 그와 같은 값을 적절히 처리하는 것은 이 함수에 달려 있습니다.입력값이 null인 경우
RETURNS NULL ON NULL INPUT
(또는 그 동의어인STRICT
)은 함수를 호출하지 않습니다. 대신, 해당 행에 대해 항상 null 값이 반환됩니다. 이 함수는 null이 아닌 입력값에 대해 여전히 null을 반환할 수도 있습니다.
기본값:
CALLED ON NULL INPUT
{ VOLATILE | IMMUTABLE }
결과를 반환할 때 함수의 동작을 지정합니다.
VOLATILE
: (예: 비결정성 및 상태 저장으로 인해) 함수는 똑같은 입력에 대해서도 다른 행에 대해 다른 값을 반환할 수 있습니다.IMMUTABLE
: 함수는 같은 입력으로 호출 시 함수가 항상 같은 결과를 반환한다고 가정합니다. 이 보증은 확인되지 않습니다. 같은 입력에 대해 다른 값을 반환하는 함수에 대해IMMUTABLE
을 지정하면 정의되지 않은 동작이 이루어집니다.
기본값:
VOLATILE
[ MAX_BATCH_ROWS = integer ]
동시성 증대를 위해 서비스에 데이터를 전송할 때 배치 크기 를 지정합니다.
COMMENT = 'string_literal'
SHOW FUNCTIONS 및 SHOW USER FUNCTIONS 출력의 DESCRIPTION 열에 표시되는 함수에 대한 설명을 지정합니다.
기본값:
user-defined function
CONTEXT_HEADERS = ( context_function_1 [ , context_function_2 ...] )
이는 Snowflake 컨텍스트 함수 결과를 HTTP 헤더에 바인딩합니다. (Snowflake 컨텍스트 함수에 대한 자세한 내용은 컨텍스트 함수 를 참조하십시오.)
모든 컨텍스트 함수가 컨텍스트 헤더에서 지원되는 것은 아닙니다. 다음 함수가 지원됩니다.
CURRENT_ACCOUNT()
CURRENT_CLIENT()
CURRENT_DATABASE()
CURRENT_DATE()
CURRENT_IP_ADDRESS()
CURRENT_REGION()
CURRENT_ROLE()
CURRENT_SCHEMA()
CURRENT_SCHEMAS()
CURRENT_SESSION()
CURRENT_STATEMENT()
CURRENT_TIME()
CURRENT_TIMESTAMP()
CURRENT_TRANSACTION()
CURRENT_USER()
CURRENT_VERSION()
CURRENT_WAREHOUSE()
LAST_QUERY_ID()
LAST_TRANSACTION()
LOCALTIME()
LOCALTIMESTAMP()
함수 이름이 CONTEXT_HEADERS 절에 나열되어 있을 때는 함수 이름을 따옴표로 묶으면 안 됩니다.
Snowflake는 헤더 앞에
sf-context
를 추가한 후 HTTP 요청에 이를 씁니다.예:
CONTEXT_HEADERS = (current_timestamp)
이 예에서, Snowflake는 헤더
sf-context-current-timestamp
를 HTTP 요청에 씁니다.컨텍스트 함수는 다음을 포함하되 이에 국한되지 않는 HTTP 헤더 값에서 잘못된 문자를 생성할 수 있습니다.
줄 바꿈
Ä
Î
ß
ë
¬
±
©
®
Snowflake는 하나 이상의 잘못된 문자로 구성된 각 시퀀스를 하나의 공백 문자로 바꿉니다. (문자가 아니라 시퀀스 단위로 바뀝니다.)
예를 들어, 컨텍스트 함수 CURRENT_STATEMENT()가 다음을 반환한다고 가정해 보십시오.
select /*ÄÎß묱©®*/ my_service_function(1);
sf-context-current-statement
에서 보낸 값은 다음과 같습니다.select /* */ my_service_function(1);
잘못된 문자를 바꾼 경우에도 서비스 코드가 컨텍스트 함수의 원래 결과(잘못된 문자 포함)에 액세스할 수 있도록 보장하기 위해, Snowflake는 base64 로 인코딩된 컨텍스트 함수 결과를 포함한 이진 컨텍스트 헤더도 전송합니다.
위의 예에서, base64로 인코딩된 헤더로 전송된 값은 다음 호출의 결과입니다.
base64_encode('select\n/ÄÎß묱©®/\nmy_service_function(1)')
원격 서비스는 필요한 경우 base64 값의 디코딩을 담당합니다.
이러한 각 base64 헤더는 다음 규칙에 따라 명명됩니다.
sf-context-<context-function>-base64
위의 예에서 헤더의 이름은 다음이 됩니다.
sf-context-current-statement-base64
컨텍스트 헤더가 전송되지 않으면 base64 컨텍스트 헤더도 전송되지 않습니다.
서비스 함수로 보낸 행이 여러 배치로 분할되면 모든 일괄 작업에 똑같은 컨텍스트 헤더와 똑같은 이진 컨텍스트 헤더가 포함됩니다.
액세스 제어 요구 사항¶
이 SQL 명령을 실행하는 데 사용되는 역할 에는 최소한 다음 권한 이 있어야 합니다.
권한 |
오브젝트 |
참고 |
---|---|---|
CREATE FUNCTION |
스키마 |
|
USAGE |
서비스 엔드포인트 |
서비스 엔드포인트에서의 사용은 서비스 사양에 정의된 서비스 역할에 부여됩니다. 그런 다음 서비스 함수를 생성하는 역할에 서비스 역할을 부여합니다. |
스키마의 모든 오브젝트에 대해 작업하려면 상위 데이터베이스 및 스키마에 대한 USAGE 권한도 필요합니다.
지정된 권한 세트로 사용자 지정 역할을 만드는 방법에 대한 지침은 사용자 지정 역할 만들기 섹션을 참조하십시오.
보안 오브젝트 에 대해 SQL 작업을 수행하기 위한 역할과 권한 부여에 대한 일반적인 정보는 액세스 제어의 개요 섹션을 참조하십시오.
사용법 노트¶
CREATE OR REPLACE <오브젝트> 문은 원자성입니다. 즉, 오브젝트가 바뀔 때 단일 트랜잭션으로 이전 오브젝트가 삭제되고 새 오브젝트가 생성됩니다.
메타데이터 관련:
주의
고객은 Snowflake 서비스를 사용할 때 개인 데이터(사용자 오브젝트 제외), 민감한 데이터, 수출 통제 대상 데이터 또는 기타 규제 데이터가 메타데이터로 입력되지 않도록 해야 합니다. 자세한 내용은 Snowflake의 메타데이터 필드 섹션을 참조하십시오.
예¶
자습서-1 에서는 다음 서비스 함수를 만듭니다.
CREATE FUNCTION my_echo_udf (InputText VARCHAR)
RETURNS VARCHAR
SERVICE=echo_service
ENDPOINT=echoendpoint
AS '/echo';
이 함수는 지정된 SERVICE의 특정 ENDPOINT와 연결합니다. 이 함수를 호출하면 Snowflake가 서비스 컨테이너 내부의 /echo
경로로 요청을 보냅니다.
다음 사항을 참고하십시오.
my_echo_udf
함수는 문자열을 입력값으로 받아 문자열을 반환합니다.SERVICE 속성은 서비스(
echo_service
)를 식별하고, ENDPOINT 속성은 사용자에게 친숙한 엔드포인트 이름(echoendpoint
)을 식별합니다.AS '/echo'
는 서비스 경로를 지정합니다.echo_service.py
에서(서비스 코드 참조)@app.post
데코레이터는 이 경로를echo
함수와 연결합니다.