SQL UDF 소개

SQL에서 UDF(사용자 정의 함수)의 처리기를 작성할 수 있습니다. 이 섹션의 항목에서는 SQL 처리기를 설계하고 작성하는 방법을 설명합니다. 예제도 찾아볼 수 있습니다.

UDF 처리기를 작성할 수 있는 언어 목록을 포함하여, UDF에 대한 소개는 사용자 정의 함수 개요 섹션을 참조하십시오.

처리기가 있으면 SQL로 UDF를 생성합니다. SQL을 사용하여 UDF을 만들거나 호출하는 방법에 대한 자세한 내용은 UDF 만들기 또는 UDF 호출하기 섹션을 참조하십시오.

참고

SQL UDF 처리기와 관련된 제한 사항은 SQL UDF 제한 사항 섹션을 참조하십시오.

이 항목의 내용:

SQL 처리기 작동 방식

사용자는 UDF를 호출할 때 UDF의 이름과 인자를 Snowflake에 전달합니다. Snowflake는 UDF의 논리를 실행하기 위해 관련 처리기 코드(인자가 있는 경우에는 인자도 포함)를 호출합니다. 그런 다음 핸들러 메서드는 출력을 Snowflake로 반환하고 Snowflake는 이를 다시 클라이언트로 전달합니다.

함수 정의는 스칼라(즉, 단일) 값을 반환하거나, 테이블 함수로 정의된 경우 행 세트를 반환하는 SQL 식일 수 있습니다.

다음 예제의 코드는 UDF에서 인자로 받은 반지름 값에서 원의 면적을 계산하는 처리기 코드를 포함하는 area_of_circle 이라는 UDF를 생성합니다.

CREATE FUNCTION area_of_circle(radius FLOAT)
  RETURNS FLOAT
  AS
  $$
    pi() * radius * radius
  $$
  ;
Copy

일반 사용

SQL UDF는 임의의 SQL 식을 평가하고 식의 결과를 반환합니다.

함수 정의는 스칼라(즉, 단일) 값을 반환하거나, 테이블 함수로 정의된 경우 행 세트를 반환하는 SQL 식일 수 있습니다.

SQL UDF 보안/권한 요구 사항

정규화되지 않은 테이블을 함수 정의가 참조하는 경우, 해당 테이블은 함수를 포함하는 스키마에서 확인됩니다. 다른 스키마 오브젝트(예: 테이블, 뷰 또는 기타 함수)에 대한 참조를 위해서는 함수 소유자에게 해당 스키마 오브젝트에 액세스할 권한이 있어야 합니다. 함수 호출자는 함수 정의에서 참조되는 오브젝트에 액세스할 권한을 가질 필요가 없으며, 함수를 사용할 권한만 있으면 됩니다.

예를 들어, 관리자는 일반적으로 액세스할 수 없는 민감한 데이터가 포함된 users 라는 테이블을 소유하고 있지만, 이 관리자는 다른 사용자가 액세스 권한을 가지고 있는 함수를 통해 총 사용자 수를 공개할 수 있습니다.

use role dataadmin;

desc table users;

+-----------+--------------+--------+-------+---------+-------------+------------+--------+------------+---------+
| name      | type         | kind   | null? | default | primary key | unique key | check  | expression | comment |
|-----------+--------------+--------+-------+---------+-------------+------------+--------+------------+---------|
| USER_ID   | NUMBER(38,0) | COLUMN | Y     | [NULL]  | N           | N          | [NULL] | [NULL]     | [NULL]  |
| USER_NAME | VARCHAR(100) | COLUMN | Y     | [NULL]  | N           | N          | [NULL] | [NULL]     | [NULL]  |
  ...
  ...
  ...
+-----------+--------------+--------+-------+---------+-------------+------------+--------+------------+---------+

create function total_user_count() returns number as 'select count(*) from users';

grant usage on function total_user_count() to role analyst;

use role analyst;

-- This will fail because the role named "analyst" does not have the
-- privileges required in order to access the table named "users".
select * from users;

FAILURE: SQL compilation error:
Object 'USERS' does not exist.

-- However, this will succeed.
select total_user_count();

+--------------------+
| TOTAL_USER_COUNT() |
|--------------------+
| 123                |
+--------------------+
Copy

역할 및 권한을 사용하여 액세스 제어를 관리하는 방법에 대한 자세한 내용은 액세스 제어의 개요 를 참조하십시오.