설정 스크립트 만들기¶
이 항목에서는 CREATE APPLICATION 명령을 실행할 때 설정 스크립트를 사용하여 애플리케이션 오브젝트에 오브젝트를 생성하는 방법을 설명합니다.
또한 애플리케이션 역할과 설정 스크립트 내에서 이러한 역할을 사용하는 방법도 설명합니다.
설정 스크립트 정보¶
설정 스크립트에는 다음 컨텍스트 중 하나에서 CREATE APPLICATION 명령이 실행될 때 실행되는 SQL 문이 포함됩니다.
컨슈머가 Snowflake Native App 을 설치하거나 업그레이드합니다.
공급자는 애플리케이션 패키지를 테스트할 때 애플리케이션 오브젝트를 생성하거나 업그레이드합니다.
참고
설정 스크립트는 SQL 명령 사용만 지원합니다. 다른 언어는 지원되지 않습니다.
설정 스크립트의 SQL 문은 앱에 필요한 애플리케이션 오브젝트 내에 오브젝트를 생성합니다. 여기에는 데이터베이스 오브젝트, 저장 프로시저, 뷰, 애플리케이션 역할 등이 포함됩니다.
설정 스크립트는 애플리케이션 패키지에 필요합니다. manifest.yml
파일은 설정 스크립트에 대한 파일 이름과 상대 경로를 모두 지정합니다. 애플리케이션 패키지가 생성될 때 명명된 스테이지에 manifest.yml
파일과 설정 스크립트가 모두 존재해야 합니다.
설정 스크립트에 대한 제한 사항¶
다음은 설정 스크립트 내에서 수행할 수 없습니다.
ALTER <오브젝트> 명령을 사용하여 LOG_LEVEL 또는 TRACE_LEVEL 속성 설정.
EXECUTE AS CALLER 프로시저 생성 또는 호출.
명명된 스테이지에 파일을 포함하기 위해 IMPORT를 사용하는 Snowpark 사용자 정의 함수(UDF) 또는 프로시저 생성.
애플리케이션 패키지에 포함되지 않은 코드를 참조하는 프로시저, 함수 또는 익명 코드 블록 호출.
CREATE FUNCTION 명령 사용 시 명명된 스테이지에서 코드 파일 가져오기.
CALL 을 사용하여 EXECUTE AS CALLER로 실행되는 프로시저 호출.
버전이 지정된 스키마 내에서 생성된 오브젝트에 대한 추가 제한 사항이 있습니다.
설정 스크립트에서 생성된 오브젝트의 표시 유형¶
설정 스크립트는 데이터베이스 수준 오브젝트 유형을 대부분 생성할 수 있습니다. 설정 스크립트로 생성된 데이터베이스 오브젝트는 애플리케이션 내부에 있습니다. 컨슈머가 앱을 설치하면 기본적으로 이러한 오브젝트는 보이지 않으며 컨슈머 계정에서 직접 액세스할 수 없습니다.
참고
공급자는 개발 모드 정보 를 사용하여 애플리케이션 패키지를 테스트할 때 설정 스크립트로 생성된 오브젝트에 액세스할 수 있습니다.
공급자는 애플리케이션 역할을 사용하여 이러한 오브젝트를 컨슈머에게 표시할 수 있습니다. 설정 스크립트 내에서 생성된 애플리케이션 역할은 애플리케이션 오브젝트를 소유한 역할에 자동으로 부여됩니다. 설정 스크립트에서 부여한 애플리케이션 역할은 취소할 수 없습니다.
애플리케이션 오브젝트를 소유하는 역할을 가진 사용자는 조직 내의 다른 역할에 애플리케이션 역할을 부여할 수 있습니다. 예를 들어 설정 스크립트는 APP_ADMIN과 같은 애플리케이션 역할을 정의하여 애플리케이션 내의 오브젝트에 액세스하는 권한을 이 역할에 부여할 수 있습니다. 애플리케이션 오브젝트를 소유하는 역할을 부여받은 사용자는 이러한 오브젝트에 대한 애플리케이션 역할을 다른 역할에 부여할 수 있습니다.
설정 스크립트에 의해 출력되는 메시지의 로그 수준을 설정합니다.¶
공급자는 설정 스크립트가 실행될 때 생성되는 메시지의 로그 수준을 지정할 수 있습니다. 추가 정보는 Snowflake Scripting에서 메시지 로깅하기 섹션을 참조하십시오.
설정 스크립트의 로그 수준을 구성하려면 다음 시스템 함수 중 하나를 사용하십시오.
예를 들어, 오류 메시지를 기록하도록 설정 스크립트를 구성하려면 설정 스크립트 시작 부분에 다음 명령을 추가하십시오.
SYSTEM$LOG('error', 'Error message');
모듈식 설정 스크립트 만들기¶
일반적인 앱의 설정 스크립트는 규모가 크고 복잡할 수 있습니다. 설정 스크립트를 보다 모듈화하고 유지 관리하기 더 쉽게 만들기 위해 공급자는 여러 보조 설정 스크립트를 호출하는 기본 설정 스크립트를 만들 수 있습니다.
예를 들어, 공급자는 오브젝트 생성, 뷰 생성, 저장 프로시저 생성 등 다양한 유형의 작업을 처리하기 위해 다양한 설정 스크립트를 생성할 수 있습니다.
CREATE APPLICATION 명령이 실행되면 manifest.yml
에 지정된 주 설정 스크립트가 실행됩니다. 주 설정 스크립트에서 추가 설정 스크립트를 실행하려면 EXECUTE IMMEDIATE FROM 명령을 사용하십시오.
기본 설정 스크립트에 포함된 설정 스크립트는 나타나는 순서대로 실행됩니다. 이러한 보조 설정 스크립트에는 EXECUTE IMMEDIATE FROM 명령의 인스턴스도 포함될 수 있습니다.
앱에 여러 설정 스크립트 추가하기¶
앱에 여러 설정 스크립트를 추가하려면 다음을 수행하십시오.
기본 설정 스크립트의 위치를
manifest.yml
에 추가합니다.artifacts: ... setup_script: scripts/setup.sql ...
기본 설정 스크립트를 만듭니다.
다음 예에서는 앱의 일반적인 디렉터리 구조를 보여줍니다.
@test.schema1.stage1: └── / ├── manifest.yml ├── readme.md ├── scripts/setup_script.sql
여기서
setup_script.sql
은 기본 설정 스크립트입니다.보조 설정 스크립트를 만듭니다.
다음 예에서는 여러 설정 스크립트가 포함된 앱의 일반적인 디렉터리 구조를 보여줍니다.
@test.schema1.stage1: └── / ├── manifest.yml ├── readme.md ├── scripts/setup_script.sql ├── scripts/secondary_script.sql ├── scripts/procs/setup_procs.sql ├── scripts/views/setup_views.sql ├── scripts/data/setup_data.sql
기본 설정 스크립트 내에서 EXECUTE IMMEDIATE FROM 명령을 사용하여 각 보조 설정 스크립트에 대한 상대 경로를 지정합니다.
... EXECUTE IMMEDIATE FROM 'secondary_script.sql' EXECUTE IMMEDIATE FROM './procs/setup_procs.sql' EXECUTE IMMEDIATE FROM './views/setup_views.sql' EXECUTE IMMEDIATE FROM './data/setup_data.sql' ...
EXECUTE IMMEDIATE FROM 명령에 제공된 경로는 기본 설정 스크립트의 위치를 기준으로 합니다.
설정 스크립트에서 EXECUTE IMMEDIATE FROM 사용에 대한 제한 사항¶
설정 스크립트 내에서 EXECUTE IMMEDIATE FROM 을 사용할 때 다음 제한 사항이 적용됩니다.
EXECUTE IMMEDIATE FROM 을 사용하여 호출된 설정 스크립트에서는 이벤트 로깅이 지원되지 않습니다.
EXECUTE IMMEDIATE FROM 은 설정 스크립트에서만 지원됩니다. 설정 스크립트 외부의 다른 컨텍스트에서는 이 명령을 사용할 수 없습니다.
컨슈머 계정의 암호화된 외부 스테이지에 저장된 파일에 대한 액세스는 지원되지 않습니다.
설정 스크립트 생성 시 모범 사례¶
Snowflake에서는 앱에 대한 설정 스크립트를 생성할 때 다음 모범 사례를 권장합니다.
CREATE 문의 멱등성 형식 사용하기¶
설정 스크립트 내에서 CREATE 명령을 사용하여 오브젝트를 만들 때 이러한 명령의 다음 버전을 사용하는 것이 좋습니다.
CREATE OR REPLACE
CREATE IF NOT EXISTS
설치 및 업그레이드 중에 설정 스크립트를 여러 번 실행할 수 있습니다. 오류가 발생하는 경우 이러한 오브젝트가 이미 존재할 수 있으며, 특히 버전이 지정된 스키마 내에서 생성된 경우에 더욱 그러합니다.
오브젝트 생성 시 대상 스키마 포함하기¶
CREATE SCHEMA 명령은 세션 컨텍스트를 변경하지 않습니다. 오브젝트는 생성될 때 대상 스키마로 정규화되어야 합니다. 예를 들어 설정 스크립트 내에서 스키마를 만들려면 다음 명령을 사용하십시오.
CREATE SCHEMA IF NOT EXISTS app_config;
CREATE TABLE IF NOT EXISTS app_config.params(...);
애플리케이션 오브젝트 외부에서 애플리케이션 오브젝트 내의 오브젝트를 참조하지 마십시오.¶
애플리케이션 오브젝트 내의 오브젝트를 참조하는 오브젝트를 애플리케이션 오브젝트 외부에 생성하지 마십시오. Snowflake Native App Framework 는 이러한 오브젝트 생성을 금지하지 않지만 컨슈머가 Snowflake Native App 을 설치할 때 문제가 발생할 수 있습니다.
예를 들어, 설정 스크립트가 애플리케이션 오브젝트 외부에 데이터베이스, 스키마, 뷰를 생성하고 뷰가 애플리케이션 오브젝트 내의 테이블을 참조하는 컨텍스트를 생각해 보십시오. 이러한 상황에서 컨슈머가 데이터베이스의 소유권을 갖고 애플리케이션 오브젝트를 삭제하면 데이터베이스의 뷰가 손상됩니다.
이 모범 사례는 설정 스크립트에서 생성된 테이블, 저장 프로시저, 사용자 정의 함수, 참조에 적용됩니다.
버전이 지정된 스키마나 버전이 지정되지 않은 스키마를 사용할 때 발생할 수 있는 오류를 고려하십시오.¶
버전이 지정된 스키마의 오브젝트는 버전이 지정되지 않은 스키마의 오브젝트를 참조할 수 있으며 그 반대의 경우도 마찬가지입니다. 설정 스크립트는 설치 또는 업그레이드 중에 오류가 발생할 경우 발생할 수 있는 상황을 고려해야 합니다. 예를 들어, 공급자는 초기 실행이 실패할 경우 설정 스크립트가 자동으로 다시 실행될 경우 어떤 일이 발생하는지 고려해야 합니다.
예를 들어, 다음을 사용하여 오브젝트를 생성해 보십시오.
CREATE OR REPLACE PROCEDURE app_state.proc()...;
GRANT USAGE ON PROCEDURE app_state.proc()
TO APPLICATION ROLE app_user;
이 예에서 CREATE OR REPLACE 문은 기존 프로시저를 대체하여 이전에 해당 프로시저에 부여된 권한을 암시적으로 제거합니다. 권한 부여는 나중에 스크립트에서 복원될 수 있지만, 스크립트가 실행 시 실패할 경우 컨슈머는 프로시저에 액세스하지 못하게 될 수 있습니다.
재시도로 해결할 수 없는 문제(예: 구문 오류)로 인해 설정 스크립트가 실패할 경우 컨슈머는 앱이 새 버전이나 패치로 업그레이드되고 권한이 복원될 때까지 프로시저에 액세스할 수 없습니다.
조심
이 섹션의 지침은 Snowflake Native App Framework 컨텍스트 외부의 태그, 마스킹 정책, 행 액세스 정책 에는 적용되지 않습니다.
태그 및 정책 할당은 버전이 지정된 스키마의 증분 버전으로 전파되지 않습니다. 다음 시나리오에서는 오류 메시지가 발생합니다(태그를 예로 사용).
버전이 지정된 스키마에서 태그를 생성하고 다른 스키마의 오브젝트에 태그를 할당합니다.
버전이 지정되지 않은 스키마에서 태그를 생성하고 버전이 지정된 스키마의 오브젝트에 태그를 할당합니다.
버전이 지정된 스키마에서 테이블이나 뷰를 생성하고 버전이 지정되지 않은 스키마에 태그가 있는 경우 테이블이나 뷰에 태그를 할당합니다.
버전이 지정되지 않은 스키마에서 테이블이나 뷰를 생성하고 버전이 지정된 스키마에 태그가 있는 경우 테이블이나 뷰에 태그를 할당합니다.
오류 메시지는 다음과 같습니다.
A TAG in a versioned schema can only be assigned to the objects in the same schema. An object in a versioned schema can only have a TAG assigned that is defined in the same schema.
정책 할당으로 인해 오류 메시지가 발생하는 경우 오류 메시지는 TAG
대신 POLICY
를 지정합니다.
오류 메시지를 방지하는 방법은 다음과 같습니다.
Snowflake Native App 공급자가 버전이 지정된 스키마에 태그 또는 태그가 설정된 오브젝트가 포함된 경우 태그와 동일한 스키마 내의 오브젝트에 태그(또는 정책)가 설정되도록 설정 스크립트를 업데이트해야 합니다. 버전이 지정되지 않은 스키마에 태그 또는 태그가 설정된 오브젝트가 포함되어 있는 경우 설정 스크립트를 업데이트할 필요가 없습니다.
애플리케이션을 설치할 때 Snowflake Native App 컨슈머가 이 오류 메시지를 보게 되면 공급자에게 설정 스크립트를 업데이트해 달라고 요청해야 합니다. 또한 컨슈머는 버전이 지정된 스키마에 존재하는 태그를 웨어하우스 등 계정의 오브젝트에 할당하거나, 버전이 지정된 스키마에 존재하는 정책을 테이블이나 열에 할당하거나, 정책이나 태그를 Snowflake Native App 내부의 버전이 지정된 스키마에 존재하는 오브젝트에 할당하면 안 됩니다. 그럴 경우 Snowflake에서는 동일한 오류 메시지를 반환합니다.
버전이 지정된 스키마 내에서 뷰 정의하기¶
항상 버전이 지정된 스키마의 공유 콘텐츠에 대한 뷰를 정의하십시오. 이렇게 하면 업그레이드 중에 뷰에 액세스하는 모든 코드가 새 열이나 기타 특성이 추가되거나 제거되더라도 일관된 뷰를 사용하게 됩니다.
시간이 많이 걸리는 작업이 호환되는지 확인하기¶
설정 스크립트가 큰 상태 테이블 업그레이드와 같이 매우 오랫동안 실행되는 작업을 수행해야 하는 경우 이러한 업데이트가 이전 버전에서 실행 중인 기존 코드와 호환되는지 확인하십시오.
애플리케이션 역할 정보¶
기본적으로 컨슈머는 애플리케이션 내에서 생성된 오브젝트에 대한 권한이 없습니다. 심지어 ACCOUNTADMIN 역할은 애플리케이션 내의 오브젝트를 볼 수 없습니다. 애플리케이션이 그 자신의 외부에서 생성하는 오브젝트(예: 데이터베이스)는 컨슈머 계정의 ACCOUNTADMIN 역할에만 표시됩니다.
애플리케이션 역할은 데이터베이스 역할과 유사하지만, 애플리케이션 내에서만 생성할 수 있습니다. 데이터베이스 역할과 달리, 애플리케이션 역할은 애플리케이션 외부에 존재하는 오브젝트에 대한 권한을 부여받을 수 있습니다.
애플리케이션 설치 시 설정 스크립트로 애플리케이션 역할을 생성해야 하며 이 역할은 애플리케이션 소유자의 역할에 자동으로 부여됩니다. 그러면 소유자가 적절한 애플리케이션 역할을 컨슈머 계정의 다른 역할에 부여할 수 있습니다.
참고
애플리케이션 역할은 애플리케이션 내에서 생성할 수 있는 유일한 유형의 역할입니다. 예를 들어 데이터베이스 역할은 애플리케이션 내에서 허용되지 않습니다.
마찬가지로, 애플리케이션 역할은 예컨대 일반 데이터베이스나 계정 수준이 아닌 애플리케이션에서만 만들 수 있습니다.
애플리케이션 역할에 부여된 모든 권한은 애플리케이션을 설치하는 데 사용되는 역할인 애플리케이션 소유자에게 전달됩니다. 소유자는 애플리케이션 역할을 컨슈머 계정 내의 다른 역할에 추가로 위임할 수 있습니다.
설정 스크립트는 애플리케이션 역할(예: USER)을 정의할 수도 있습니다. 이 역할을 사용하면 애플리케이션에서 제공하는 함수을 사용할 수 있는 액세스 권한이 컨슈머에게 부여됩니다. 설정 스크립트는 READ_ONLY와 같은 애플리케이션 역할을 정의하여 애플리케이션 내에서 데이터의 일부 영역에 대해 제한적인 액세스를 제공할 수 있습니다.
데이터베이스 역할과 달리, 설치된 애플리케이션 외부의 오브젝트에 대한 권한이 애플리케이션 역할에도 부여될 수 있습니다. 따라서 애플리케이션 외부의 오브젝트에 대한 권한을 부여하는 데 이러한 역할을 사용할 수 있습니다. 하지만 애플리케이션 역할 자체는 애플리케이션 내에서 생성해야 합니다.
애플리케이션 역할로 작업하기 위해 지원되는 SQL 명령¶
Snowflake Native App Framework 는 애플리케이션 역할로 작업하기 위해 다음 SQL 명령을 제공합니다.
설정 스크립트에서 애플리케이션 역할 사용하기¶
설정 스크립트에 정의된 애플리케이션 역할은 애플리케이션 인스턴스를 소유한 역할에 자동으로 부여됩니다. 애플리케이션이 설치되면 애플리케이션을 설치하는 데 사용되는 역할이 애플리케이션의 소유자입니다. 하지만 애플리케이션 소유자는 컨슈머 계정의 다른 계정 역할에 권한을 부여할 수 있습니다.
애플리케이션 역할을 통해 애플리케이션 내의 오브젝트에 대한 권한을 컨슈머에게 부여할 수 있습니다. 예:
CREATE APPLICATION ROLE admin;
CREATE APPLICATION ROLE user;
GRANT APPLICATION ROLE user TO APPLICATION ROLE admin;
CREATE OR ALTER VERSIONED SCHEMA app_code;
GRANT USAGE ON SCHEMA app_code TO APPLICATION ROLE admin;
GRANT USAGE ON SCHEMA app_code TO APPLICATION ROLE user;
CREATE OR REPLACE PROCEDURE app_code.config_app(...)
GRANT USAGE ON PROCEDURE app_code.config_app(..)
TO APPLICATION ROLE admin;
CREATE OR REPLACE FUNCTION app_code.add(x INT, y INT)
GRANT USAGE ON FUNCTION app_code.add(INT, INT)
TO APPLICATION ROLE admin;
GRANT USAGE ON FUNCTION app_code.add(INT, INT)
TO APPLICATION ROLE user;
이 예에서 설정 스크립트는 admin
및 user
라는 애플리케이션 역할을 생성합니다. 그런 다음 설정 스크립트는 두 애플리케이션 역할에 모두 애플리케이션 코드가 포함된 스키마에 액세스할 권한을 부여합니다. 또한 스키마 내에서 add
함수에 대한 액세스 권한을 부여합니다. admin
역할에 config_app
프로시저에 대한 액세스 권한도 부여됩니다.
애플리케이션 역할 및 버전¶
애플리케이션 역할은 버전이 지정되지 않습니다. 즉, 애플리케이션 역할을 삭제하거나 버전이 지정된 스키마에 없는 오브젝트에서 권한을 취소하면 애플리케이션의 현재 버전이나 업그레이드 중인 버전에 영향을 미칠 수 있습니다. 애플리케이션 역할은 해당 역할을 사용하는 모든 애플리케이션 버전을 삭제한 경우에만 안전하게 삭제할 수 있습니다.
참고
애플리케이션 역할에는 오브젝트의 소유권을 부여할 수 없습니다. 즉, 설정 스크립트에 정의된 애플리케이션 역할은 컨슈머가 설치된 Snowflake Native App 내의 오브젝트에 액세스할 수 있도록 허용할 목적으로만 사용해야 한다는 뜻입니다.