저장 프로시저 개요¶
저장 프로시저를 작성하여 프로시저 코드로 시스템을 확장할 수 있습니다. 프로시저를 사용하면 분기, 루핑 및 기타 프로그래밍 구조를 사용할 수 있습니다. 다른 코드에서 프로시저를 호출하여 프로시저를 여러 번 재사용할 수 있습니다.
저장 프로시저를 사용하면 가능합니다.
여러 데이터베이스 작업을 자주 수행해야 하는 작업을 자동화하십시오.
데이터베이스 작업을 동적으로 생성하고 실행합니다.
프로시저를 실행하는 역할의 권한이 아니라 프로시저를 소유한 역할의 권한으로 코드를 작성할 수 있습니다.
이를 통해 저장 프로시저 소유자는 지정된 작업을 수행할 수 없는 사용자에게 작업 수행 권한을 위임할 수 있습니다. 하지만 이러한 소유자 권한 저장 프로시저에는 제한이 있습니다.
예를 들어, 지정된 날짜보다 오래된 데이터를 삭제하여 데이터베이스를 정리하고 싶은 경우를 생각해 보십시오. 코드에서 삭제 작업을 여러 번 실행하여 매번 특정 테이블에서 데이터를 삭제할 수 있습니다. 이러한 문자를 모두 단일 저장 프로시저에 넣은 다음 마감일을 지정하는 매개 변수를 전달할 수 있습니다.
프로시저가 배포되면 이를 호출하여 데이터베이스를 정리할 수 있습니다. 데이터베이스가 변경될 때 프로시저를 업데이트하여 추가 테이블을 정리할 수 있습니다. 새 정리 명령을 사용하는 사용자가 여러 명인 경우 모든 테이블 이름을 기억하고 각 테이블을 개별적으로 정리하는 게 아니라 하나의 프로시저를 호출해 정리할 수 있습니다.
저장 프로시저는 UDF와 같지만, 두 가지 중요한 면에서 다릅니다. 자세한 내용은 저장 프로시저를 작성할지 사용자 정의 함수를 작성할지 선택하기 섹션을 참조하십시오.
프로시저는 Snowflake를 확장하는 한 가지 방법일 뿐입니다. 다른 방법은 다음 섹션을 참조하십시오.
지원 언어 및 도구¶
선호하는 작업 방식에 따라 여러 도구 중 하나를 사용하여 저장 프로시저(및 기타 Snowflake 엔터티)를 만들고 관리할 수 있습니다.
언어 |
접근 방식 |
지원 |
---|---|---|
SQL Java, JavaScript, Python, Scala 또는 SQL 스크립트에서 처리기 사용 |
Snowflake에서 SQL 코드를 작성하여 Snowflake 엔터티를 만들고 관리합니다. 지원되는 처리기 언어 중 하나로 프로시저의 로직을 작성합니다. |
|
Java, Python 또는 Scala |
클라이언트에서 처리를 위해 Snowflake로 푸시되는 작업에 대한 코드를 작성합니다. |
|
명령줄 인터페이스 |
명령줄을 사용하여 속성을 JSON 오브젝트의 속성으로 지정하여 Snowflake 엔터티를 만들고 관리할 수 있습니다. |
|
Python |
클라이언트에서 Snowflake에서 관리 작업을 실행하는 코드를 작성합니다. |
|
REST |
RESTful 엔드포인트에 요청하여 Snowflake 엔터티를 생성하고 관리하십시오. |
지원되는 언어 중 하나로 프로시저의 논리(처리기)를 작성합니다. 처리기가 있으면 CREATE PROCEDURE 명령으로 프로시저를 생성 한 다음, CALL 문으로 프로시저를 호출 할 수 있습니다.
저장 프로시저에서 단일 값 또는 (처리기 언어에서 지원되는 경우) 테이블 형식 데이터를 반환할 수 있습니다. 지원되는 반환 유형에 대한 자세한 내용은 CREATE PROCEDURE 섹션을 참조하십시오.
언어를 선택할 때 지원되는 처리기 위치도 고려하십시오. 일부 언어에서는 스테이지에서 처리기 참조를 지원하지 않습니다(대신 처리기 코드는 인라인이어야 함). 자세한 내용은 처리기 코드를 인라인 또는 스테이지에 유지하기 섹션을 참조하십시오.
언어 |
처리기 위치 |
---|---|
Java |
인라인 또는 스테이징됨 |
JavaScript |
인라인 |
Python |
인라인 또는 스테이징됨 |
Scala |
인라인 또는 스테이징됨 |
Snowflake Scripting |
인라인 |
참고
익명 프로시저를 만들기도 하고 호출도 하려면 CALL(익명 프로시저 사용) 를 사용하십시오. 익명 프로시저를 만들고 호출하는 데는 CREATE PROCEDURE 스키마 권한이 있는 역할이 필요하지 않습니다.
저장 프로시저 예제¶
다음 예제의 코드는 run
이라는 Python 처리기를 사용하여 myproc
이라는 저장 프로시저를 생성합니다.
CREATE OR REPLACE PROCEDURE myproc(from_table STRING, to_table STRING, count INT)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = '3.9'
PACKAGES = ('snowflake-snowpark-python')
HANDLER = 'run'
as
$$
def run(session, from_table, to_table, count):
session.table(from_table).limit(count).write.save_as_table(to_table)
return "SUCCESS"
$$;
다음 예제의 코드는 저장 프로시저 myproc
을 호출합니다.
CALL myproc('table_a', 'table_b', 5);
지침 및 제약 조건¶
- 팁:
저장 프로시저 작성에 대한 팁은 저장 프로시저 관련 작업하기 섹션을 참조하십시오.
- Snowflake 제약 조건:
Snowflake 제약 조건 내에서 개발하여 Snowflake 환경 내에서 안정성을 보장할 수 있습니다. 자세한 내용은 Snowflake에서 적용한 제약 조건 내에서 유지되는 처리기 설계하기 섹션을 참조하십시오.
- 명명:
다른 프로시저와 충돌하지 않도록 프로시저 이름을 지정해야 합니다. 자세한 내용은 프로시저와 UDF의 명명 및 오버로딩 섹션을 참조하십시오.
- 인자:
저장 프로시저에 대한 인자를 지정하고 선택적인 인자를 표시합니다. 자세한 내용은 UDF 및 저장 프로시저에 대한 인자 정의하기 섹션을 참조하십시오.
- 데이터 타입 매핑:
각 처리기 언어에 대해 언어의 데이터 타입과 인자 및 반환 값에 사용되는 SQL 유형 간에 별도의 매핑 세트가 있습니다. 각 언어의 매핑에 대한 자세한 내용은 SQL 및 처리기 언어 간의 데이터 타입 매핑 섹션을 참조하십시오.
처리기 작성¶
- 처리기 언어:
처리기 작성에 대한 언어별 콘텐츠는 지원 언어 및 도구 섹션을 참조하십시오.
- 외부 네트워크 액세스:
외부 네트워크 액세스 로 외부 네트워크 위치에 액세스할 수 있습니다. Snowflake 외부의 특정 네트워크 위치에 대한 보안 액세스를 생성한 다음, 처리기 코드 내에서 해당 액세스를 사용할 수 있습니다.
- 로깅 및 추적:
로그 메시지와 추적 이벤트를 캡처하고 나중에 쿼리할 수 있는 데이터베이스에 데이터를 저장하여 코드 활동을 기록할 수 있습니다.
보안¶
호출자 권한 또는 소유자 권한으로 저장 프로시저를 실행하도록 선택하는지 여부는 액세스 권한이 있는 정보와 수행하도록 허용될 수 있는 작업에 영향을 미칠 수 있습니다. 자세한 내용은 호출자 권한 및 소유자 권한 저장 프로시저 이해하기 섹션을 참조하십시오.
저장 프로시저는 UDF(사용자 정의 함수)와 특정 보안 문제를 공유합니다. 자세한 내용은 다음을 참조하십시오.
UDF 및 프로시저의 보안 모범 사례 에 설명된 모범 사례에 따라 프로시저의 처리기 코드가 안전하게 실행되도록 도울 수 있습니다.
민감한 정보에 액세스하면 안 되는 사용자가 민감한 정보를 볼 수 없도록 되어 있는지 확인합니다. 자세한 내용은 Secure UDF와 저장 프로시저로 민감한 정보 보호하기 섹션을 참조하십시오.
처리기 코드 배포¶
프로시저를 생성할 때 프로시저의 논리를 구현하는 처리기를 CREATE PROCEDURE 문으로 인라인 코드로 지정하거나 스테이지에 패키징 및 복사되는 컴파일된 코드와 같이 문 외부의 코드로 지정할 수 있습니다.
자세한 내용은 처리기 코드를 인라인 또는 스테이지에 유지하기 섹션을 참조하십시오.