애플리케이션 패키지에 공유 데이터 콘텐츠 추가하기

이 항목에서는 애플리케이션 패키지에 공유 데이터 콘텐츠를 추가하는 방법에 대해 설명합니다.

애플리케이션 패키지에서 데이터 콘텐츠 공유하기 정보

Snowflake Native App Framework 를 사용하면 공유 데이터 콘텐츠를 애플리케이션 패키지에 추가할 수 있습니다. 이 데이터 콘텐츠는 자신의 Snowflake Native App 을 사용하는 컨슈머와 공유됩니다. 애플리케이션 패키지에서 공유하는 데이터 콘텐츠는 Snowflake Native App 의 설치된 모든 인스턴스에 걸쳐 공유됩니다.

공유 데이터 콘텐츠는 버전이 관리되지 않는데, 이는 Snowflake Native App 의 모든 버전이 동일한 데이터를 사용한다는 의미입니다. 이는 버전이 관리되는 애플리케이션 논리와는 다릅니다.

컨슈머는 공유 콘텐츠에 직접 액세스할 수 없습니다. 대신 공급자는 애플리케이션 패키지의 설정 스크립트에서 보안 뷰를 생성하고 컨슈머에게 보안 뷰에 대한 액세스 권한을 부여합니다. 자세한 내용은 컨슈머에게 공유 오브젝트 노출하기 섹션을 참조하십시오.

애플리케이션 패키지와 공유할 수 있는 데이터베이스 오브젝트

공급자는 Snowflake Native App Framework 를 사용하여 다음 데이터베이스 오브젝트를 애플리케이션 패키지에 추가할 수 있습니다.

  • 스키마

  • 테이블

참고

테이블 및 뷰와 같은 데이터베이스 오브젝트를 공유할 때 이들을 포함하는 스키마도 공유해야 합니다.

애플리케이션 패키지에서 공유되는 테이블과 뷰에는 다음 제한 사항이 적용됩니다.

  • 테이블에는 Java, Python 또는 JavaScript 코드를 포함하는 정책을 비롯한 가상 열이 있을 수 없습니다.

  • 정책과 같이 뷰 정의 또는 이와 연결된 가상 열은 Java, Python 또는 JavaScript에 대한 호출을 포함할 수 없습니다.

  • 공유 테이블은 임시, 휘발성 또는 일시적 테이블일 수 없습니다.

  • 외부 테이블은 지원되지 않습니다.

애플리케이션 패키지 내에서 데이터 콘텐츠 공유하기

애플리케이션 패키지에 데이터 콘텐츠를 포함하려면 애플리케이션 패키지와 공유할 오브젝트에 대한 권한을 부여해야 합니다. 애플리케이션 패키지에 오브젝트를 추가할 때 기본적으로 해당 오브젝트는 애플리케이션 패키지 전용이며 Snowflake Native App 이 설치될 때 표시되지 않습니다.

오브젝트가 애플리케이션 패키지에서 설치된 Snowflake Native App 에 표시되도록 하려면 다음 예와 같이 GRANT … TO SHARE IN APPLICATION PACKAGE 명령을 사용하십시오.

CREATE APPLICATION PACKAGE app_package;

GRANT USAGE ON SCHEMA app_package.shared_schema
  TO SHARE IN APPLICATION PACKAGE app_package;
GRANT SELECT ON TABLE app_package.shared_schema.shared_table
  TO SHARE IN APPLICATION PACKAGE app_package;
Copy

이 예에서 첫 번째 명령은 shared_schema 스키마에 대한 USAGE 권한을 애플리케이션 패키지에 부여하여 이 스키마를 컨슈머와 공유할 수 있도록 합니다. 두 번째 명령은 shared_schema 내의 shared_table 테이블에 대한 SELECT 권한을 애플리케이션 패키지에 부여하여 컨슈머가 테이블을 쿼리할 수 있도록 합니다.

컨슈머는 애플리케이션 패키지 app_package 에서 Snowflake Native App 을 설치한 후 shared_schema 에 액세스하고 shared_table 을 쿼리할 수 있습니다.

참고

애플리케이션 패키지에 공유 오브젝트를 추가하는 경우 해당 오브젝트가 포함된 스키마도 공유해야 합니다.

유사한 SQL 명령을 사용하여 애플리케이션과 뷰를 공유할 수도 있습니다.

애플리케이션 패키지 외부에 있는 오브젝트 참조하기

애플리케이션 패키지 외부에 있는 데이터베이스 오브젝트를 공유하려면 오브젝트에 액세스할 수 있도록 애플리케이션 패키지 내에 뷰를 만들어야 합니다. 애플리케이션 패키지 외부의 오브젝트를 직접 공유할 수는 없습니다.

다른 데이터베이스에서 오브젝트를 공유하기 전에 다음 예와 같이 해당 데이터베이스에 대한 REFERENCE_USAGE 권한을 애플리케이션 패키지의 공유에 부여합니다.

GRANT REFERENCE_USAGE ON DATABASE other_db
  TO SHARE IN APPLICATION PACKAGE app_pkg;
Copy

외부 데이터베이스에 대한 REFERENCE_USAGE를 부여한 후, 다음 예와 같이 공유된 오브젝트를 참조하는 애플리케이션 패키지 내에 뷰를 만들어야 합니다.

CREATE VIEW app_pkg.shared_schema.shared_view
  AS SELECT c1, c2, c3, c4
  FROM other_db.other_schema.other_table;
Copy

이 명령으로 애플리케이션 패키지 외부의 데이터베이스, 테이블, 스키마를 참조하는 뷰를 애플리케이션 패키지에 만듭니다.

뷰를 만든 후 다음 예와 같이 스키마와 뷰에 대한 권한을 애플리케이션에 부여해야 합니다.

GRANT USAGE ON SCHEMA app_pkg.shared_schema
  TO SHARE IN APPLICATION PACKAGE app_pkg;
GRANT SELECT ON VIEW app_pkg.shared_schema.shared_view
  TO SHARE IN APPLICATION PACKAGE app_pkg;
Copy

애플리케이션에서 공유 오브젝트에 대한 액세스 허용하기

설정 스크립트에서 정의되고 생성된 데이터베이스 오브젝트는 설치 후 Snowflake Native App 에 직접 액세스할 수 있습니다. 이러한 오브젝트에는 함수, 프로시저, 새 뷰 정의 등이 포함될 수 있습니다.

설정 스크립트에 정의된 보안 뷰를 사용하여 설치된 Snowflake Native App 의 컨슈머만 애플리케이션 패키지 외부의 데이터베이스 오브젝트에 액세스할 수 있습니다.

다음 예에서는 설정 스크립트에 뷰를 정의하는 방법을 보여줍니다.

CREATE VIEW IF NOT EXISTS inst_schema.shared_view
  AS SELECT c1, c2, c3, c4
  FROM shared_schema.shared_view;
Copy

이 뷰는 이전 섹션의 예에서처럼 애플리케이션 패키지와 공유되는 shared_schema.shared_view 의 콘텐츠에 액세스합니다.

참고

공유 데이터 콘텐츠(예: 애플리케이션 패키지 외부의 데이터베이스 오브젝트)에 직접 액세스하는 뷰를 정의하려고 하면 Snowflake에서 오류를 반환합니다.

컨슈머에게 공유 오브젝트 노출하기

기본적으로, 애플리케이션 패키지와 공유되는 데이터베이스 오브젝트는 컨슈머에게 표시되지 않습니다. 컨슈머가 데이터 콘텐츠를 보고 액세스할 수 있도록 하려면 애플리케이션 패키지가 보안 뷰를 생성하고 적절한 권한을 부여해야 합니다.

이 접근 방식의 이점은 다음과 같습니다.

  • 설정 스크립트에서 뷰를 생성하면 새 열과 같은 공유 오브젝트에 대해 직접적으로 이루어진 변경 사항이 설정 스크립트로 설치되는 버전의 Snowflake Native App 에 표시되지 않습니다.

  • 버전이 지정된 스키마에서 뷰를 생성하면 Snowflake Native App 의 각 버전에 해당 버전에 대한 뷰의 정의만 포함됩니다. 이는 업그레이드 시나리오에서 중요합니다.

공유 오브젝트를 컨슈머에게 노출하려면 설정 스크립트에 다음 동작을 위한 명령이 포함되어야 합니다.

  • 애플리케이션 패키지에서 버전이 지정된 스키마 내에 뷰를 설치하는 명령.

  • 애플리케이션 역할을 사용하여 컨슈머에게 해당 뷰에 대한 액세스 권한을 부여하는 명령.

다음 예에서는 애플리케이션 역할을 사용하여 애플리케이션 패키지의 설정 스크립트 내에서 공유 오브젝트에 대한 액세스 권한을 부여하는 방법을 설명합니다.

CREATE APPLICATION ROLE app_user;

CREATE OR ALTER VERSIONED SCHEMA inst_schema;
GRANT USAGE ON SCHEMA inst_schema
  TO APPLICATION ROLE app_user;

CREATE VIEW IF NOT EXISTS inst_schema.shared_view
  AS SELECT c1, c2, c3, c4
  FROM shared_schema.shared_table;

GRANT SELECT ON VIEW inst_schema.shared_view
  TO APPLICATION ROLE app_user;
Copy

Snowflake Native App Framework 가 공유 콘텐츠를 보호하는 방법

공급자 데이터 콘텐츠의 개인 정보와 무결성을 보호하기 위해 Snowflake Native App Framework 는 다음과 같은 제한 사항을 구현합니다.

  • 공유 오브젝트는 설치된 Snowflake Native App 에 대해 읽기 전용입니다.

  • 공유 오브젝트는 컨슈머에게 직접 노출되지 않습니다. 오브젝트는 Snowflake Native App 설치 중에 설정 스크립트가 실행될 때 설치된 보안 뷰를 통해서만 노출됩니다.

  • 공급자만 공유 콘텐츠를 업데이트할 수 있습니다.

  • 특정 권한으로 설치된 Snowflake Native App 의 인스턴스와 공유할 수 있는 오브젝트는 다음 오브젝트뿐입니다.

    • 스키마: Snowflake Native App 의 공유 콘텐츠에 USAGE 권한만 부여할 수 있습니다.

    • 테이블: Snowflake Native App 의 공유 콘텐츠에 SELECT 권한만 부여할 수 있습니다. 정의된 정책(행 액세스 정책, 마스킹 정책, 태그 기반 정책 등)이 있는 테이블은 공유할 수 없습니다. 컨슈머에게 노출 시 오브젝트에 대해 정책을 정의할 수 있습니다.

    • 뷰: 애플리케이션 패키지의 공유 콘텐츠에 SELECT 권한만 부여할 수 있습니다. 행 액세스, 마스킹, 태그 기반 등을 포함하여 정의된 정책이 있는 뷰는 공유할 수 없습니다.

참고

뷰 또는 해당 뷰가 구성되는 원본이 되는 뷰는 JavaScript, Java, Python 또는 Scala 함수를 포함할 수 없습니다.

자세한 내용은 컨슈머에게 공유 오브젝트 노출하기 섹션을 참조하십시오.

정책과의 데이터 콘텐츠 공유에 대한 제한 사항

공급자는 마스킹 정책, 행 액세스 정책 및 기타 정책 유형을 포함한 정책과 테이블 및 뷰를 공유할 수 없습니다. 공급자 측에서 정책을 추가하거나 변경하면 실행 중인 Snowflake Native App 의 인스턴스가 즉시 중단될 수 있으므로 이런 제한이 필요합니다.

또한 정책에서 공통적으로 참조하는 일부 함수(예: CURRENT_USER)는 애플리케이션 패키지의 컨텍스트에서 서로 다르게 동작합니다. 공급자가 정의한 정책이 공급자의 계정에서 올바르게 작동하더라도 컨슈머가 Snowflake Native App 을 설치할 때는 작동하지 않을 수 있습니다.

설정 스크립트에 지정된 프록시 뷰에 대한 정책을 정의하는 것이 좋습니다. 프록시 뷰에 정책을 정의하면 Snowflake Native App 이 설치된 후에는 정책 정의를 변경할 수 없게 됩니다. 또한 프록시 뷰에 대한 정책을 정의하면 업그레이드 중에 실행 중인 코드가 버전이 생성된 시점에 적용되었던 정책을 계속 사용하게 됩니다.

공유 오브젝트에 대한 권한 취소 및 삭제하기

애플리케이션 패키지에서 공유 오브젝트에 대한 권한을 취소하거나 공유 오브젝트를 삭제할 때는 주의하십시오. 설치된 Snowflake Native App 버전에서 여전히 이러한 오브젝트에 액세스해야 하는 경우 Snowflake Native App 이 불안정해지거나 실패할 수 있습니다.