User-Defined Functions and Stored Procedures in Declarative Shared Native Applications

Declarative Native Apps can include stored procedures and user-defined functions (UDFs) to query, visualize, and explore the data. This topic describes how to include these logic objects in your app.

지원되는 사용자 정의 함수 및 저장 프로시저

|declarative-app-short|에서 다음 유형의 사용자 정의 함수(UDFs) 및 저장 프로시저를 공유할 수 있습니다.

  • Stored procedures that have OWNERS RIGHTS or RESTRICTED CALLERS RIGHTS. For more information, see Understanding caller’s rights and owner’s rights stored procedures.

  • 모든 유형의 UDFs, EXTERNAL 함수 제외

  • Python, Java, Javascript, Scala로 작성된 Snowpark UDFs 및 저장 프로시저. Snowpark Container Service Functions는 지원되지 않습니다.

애플리케이션에 사용자 정의 함수 및 저장 프로시저 포함하기

|declarative-app-short|에 UDFs 및 저장 프로시저를 포함하려면 오브젝트의 이름과 해당 권한을 manifest.yaml 파일에 추가합니다. 노트북에서처럼 별도의 파일을 사용하여 오브젝트를 추가할 필요가 없습니다.

다음 예제에서는 manifest.yaml 파일에 UDF 및 저장 프로시저를 포함하는 방법을 보여줍니다.

manifest_version: 2

roles:
  - ANALYST:
      comment: "The ANALYST role provides access to logic objects."

shared_content:
  databases:
    - SNAF_POPULATION_DB:
        schemas:
          - LOGIC_SCHEMA:
              roles: [ANALYST]
              functions:
                - POPULATION_ANALYSIS_FUNCTION(NUMBER):
                    roles: [ANALYST]
              procedures:
                - POPULATION_ANALYSIS_PROCEDURE():
                    roles: [ANALYST]
Copy

이 예제에서는 POPULATION_ANALYSIS_FUNCTION UDF 및 POPULATION_ANALYSIS_PROCEDURE 저장 프로시저가 manifest.yaml 파일에 포함됩니다. ANALYST 앱 역할에는 두 오브젝트에 대한 액세스 권한이 부여됩니다.

UDFs 및 저장 프로시저를 사용하여 비공개(비공유) 오브젝트에 액세스하기

UDFs 및 저장 프로시저를 사용하여 비공개(비공유) 테이블과 뷰에 액세스할 수 있습니다. 예를 들어, 데이터베이스에 컨슈머에게 표시되지 않는 뷰가 있을 수 있지만, 컨슈머는 저장 프로시저를 사용하여 해당 뷰에서 데이터를 검색할 수 있습니다.

고객이 UDFs 및 저장 프로시저를 사용하여 비공개 오브젝트에 액세스할 수 있도록 허용하려면 manifest.yaml 파일에서 오브젝트를 private: true 키워드로 표시합니다.

다음 예제에서는 저장 프로시저가 manifest.yaml 파일의 비공개 테이블에 액세스하도록 허용하는 방법을 보여줍니다.

manifest_version: 2

roles:
  - VIEWER:
      comment: "The VIEWER role can access a stored procedure that retrieves data from a view, but not the underlying view."

shared_content:
  databases:
    - SNAF_POPULATION_DB:
        schemas:
          - DATA_SCHEMA:
              views: # This view is private as no roles are granted
                - COUNTRY_POP_BY_YEAR_2000:
                    private: true
          - LOGIC_SCHEMA:
              roles: [VIEWER]
              procedures:
                - POPULATION_DISPLAY_PROCEDURE():
                    roles: [VIEWER]
Copy

이전 예제에서 COUNTRY_POP_BY_YEAR_2000 뷰는 액세스 권한이 부여되지 않았기 때문에 비공개이지만, private 매개 변수를 사용하면 논리 오브젝트가 액세스할 수 있습니다. VIEWER 앱 역할은 저장 프로시저를 실행할 수 있지만, 비공개 뷰를 직접 쿼리할 수는 없습니다. COUNTRY_POP_BY_YEAR_2000 뷰가 참조하는 테이블은 뷰가 액세스하기 위해 manifest.yaml 파일에 포함될 필요가 없습니다.

제한 사항

지원되는 언어 및 유형

Snowpark UDFs and stored procedures written in Python, Java, Javascript, and Scala. Snowpark Container Service functions are not supported.

데이터 오브젝트 및 논리 오브젝트에 대한 스키마

데이터 오브젝트(테이블 및 뷰)와 논리 오브젝트(UDFs 및 저장 프로시저)에 대해 별도의 스키마를 사용해야 합니다. 예를 들어, 테이블 및 뷰의 경우 이름이 :code:`DATA_SCHEMA`인 스키마를 사용하고 UDFs 및 저장 프로시저의 경우 이름이 :code:`LOGIC_SCHEMA`인 스키마를 사용할 수 있습니다.

비공개 오브젝트 참조하기

UDFs 및 저장 프로시저는 스키마 정규화된 이름으로 비공개 오브젝트를 참조해야 합니다. 논리 오브젝트는 정규화된 이름으로 비공개 오브젝트를 참조할 수 없습니다.

오브젝트 수

|declarative-app-short|은 최대 100개의 UDFs 및 저장 프로시저를 포함할 수 있습니다. 이 한도를 늘리려면 `Snowflake 지원`_에 문의하세요.

동적 테이블

UDFs 및 저장 프로시저에서 동적 테이블 참조는 지원되지 않습니다.