설정 스크립트 만들기

이 항목에서는 설정 스크립트를 사용하여 애플리케이션 설치 시 생성되는 오브젝트를 지정하는 방법을 설명합니다. 또한 애플리케이션 역할과 설정 스크립트 내에서 이러한 역할을 사용하는 방법도 설명합니다.

설정 스크립트 정보

애플리케이션의 설정 스크립트에는 컨슈머가 애플리케이션을 설치하거나 업그레이드할 때 또는 공급자가 테스트를 위해 애플리케이션을 설치하거나 업그레이드할 때 실행되는 SQL 문이 포함됩니다. 모든 애플리케이션은 설정 스크립트를 포함해야 합니다. 설정 스크립트의 위치는 매니페스트 파일에 지정됩니다.

설정 스크립트는 애플리케이션 설치 또는 업그레이드 시에 생성되는 오브젝트를 정의합니다.

참고

애플리케이션 패키지를 생성하려면 설정 스크립트가 필요합니다. 설정 스크립트의 이름과 경로는 manifest.yml 파일에 지정됩니다.

설정 스크립트에 대한 제한 사항

다음 작업은 설정 스크립트 내에서 수행할 수 없습니다.

  • USE DATABASE

  • USE SCHEMA

  • USE ROLE

  • USE SECONDARY ROLES

  • ALTER <오브젝트> 명령을 사용하여 LOG_LEVEL 또는 TRACE_LEVEL 속성 설정.

  • EXECUTE AS CALLER 프로시저 생성 또는 호출.

  • 명명된 스테이지에서 IMPORT를 활용하는 Snowpark 사용자 정의 함수(UDF) 또는 프로시저 생성.

  • 확장 코드를 사용하는 프로시저, 함수 또는 익명 코드 블록 호출.

  • CREATE FUNCTION 명령 사용 시 명명된 스테이지에서 코드 파일 가져오기.

  • CALL 을 사용하여 EXECUTE AS CALLER가 있는 프로시저 호출.

버전이 지정된 스키마 내에서 생성된 오브젝트에 대한 추가 제한 사항이 있습니다.

컨슈머에 대한 설정 스크립트에서 생성된 오브젝트의 표시 유형

설정 스크립트는 대부분의 데이터베이스 수준 오브젝트를 정의할 수 있습니다. 설정 스크립트로 생성된 데이터베이스 오브젝트는 애플리케이션 내부에 있습니다. 이러한 오브젝트는 표시되지 않으며 컨슈머 계정에 직접 액세스할 수 없습니다.

애플리케이션 역할을 사용하여 이러한 오브젝트를 컨슈머에게 표시할 수 있습니다. 설정 스크립트 내에서 생성된 모든 애플리케이션 역할은 설치된 애플리케이션의 인스턴스를 소유한 역할에 자동으로 부여됩니다. 이러한 역할은 취소할 수 없습니다.

애플리케이션 인스턴스를 소유하는 역할을 가진 사용자는 조직 내의 다른 역할에 애플리케이션 역할을 부여할 수 있습니다. 예를 들어 설정 스크립트는 APP_ADMIN과 같은 애플리케이션 역할을 정의하여 애플리케이션 내의 오브젝트에 액세스하는 권한을 이 역할에 부여할 수 있습니다. 그러면 해당 사용자가 이러한 오브젝트를 사용하여 애플리케이션을 관리할 수 있습니다.

설정 스크립트는 애플리케이션 역할(예: USER)을 정의할 수도 있습니다. 이 역할을 사용하면 애플리케이션에서 제공하는 함수을 사용할 수 있는 액세스 권한이 컨슈머에게 부여됩니다. 설정 스크립트는 READ_ONLY와 같은 애플리케이션 역할을 정의하여 애플리케이션 내에서 데이터의 일부 영역에 대해 제한적인 액세스를 제공할 수 있습니다.

설정 스크립트는 초기 설치와 업그레이드에 모두 사용됩니다. 스크립트는 idempotent 방식으로 작성해야 합니다. 예를 들어 CREATE .. IF NOT EXISTS 또는 CREATE OR REPLACE로 오브젝트를 만듭니다.

설정 스크립트 생성 시 모범 사례

Snowflake에서는 애플리케이션에 대한 설정 스크립트를 생성할 때 다음 모범 사례를 권장합니다.

  • 설정 스크립트 내에서 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(...);
    
    Copy
  • 버전이 지정된 스키마 오브젝트는 버전이 지정되지 않은 오브젝트를 참조할 수 있으며 그 반대도 마찬가지입니다. 설정 스크립트가 실행 중일 때 실패 가능성을 고려해야 합니다. 설정 스크립트가 idempotent가 되도록 작성된 점을 고려하면 초기 실행이 실패할 경우 자동으로 다시 실행됩니다.

    스키마 내에서 애플리케이션 역할에 부여할 때 이 점을 고려하십시오. 예를 들어 다음을 사용해 보십시오.

    CREATE OR REPLACE PROCEDURE app_state.proc()...;
    -- Additional CREATE statements
    GRANT USAGE ON PROCEDURE app_state.proc()
       TO APPLICATION ROLE app_user;
    
    Copy

    CREATE OR REPLACE 문은 이전에 해당 프로시저에 부여된 권한을 암시적으로 제거하는 프로시저를 대체합니다. 권한 부여는 나중에 스크립트에서 복원되지만, 스크립트가 실행 시 실패할 경우 컨슈머는 프로시저에 액세스하지 못하게 될 수 있습니다.

    재시도로 해결할 수 없는 문제(예: 구문 오류)로 인해 설정 스크립트가 실패할 경우 컨슈머는 새 버전이나 패치가 업그레이드되고 권한이 복원될 때까지 프로시저에 액세스할 수 없습니다.

  • 공유 콘텐츠에 대한 뷰는 항상 버전이 지정된 스키마에서 정의해야 합니다. 이렇게 하면 업그레이드 중에 뷰에 액세스하는 모든 코드가 새 열이나 기타 특성이 추가되거나 제거되더라도 일관된 뷰를 사용하게 됩니다.

  • 설정 스크립트가 큰 상태 테이블 업그레이드와 같이 매우 오랫동안 실행되는 작업을 수행해야 하는 경우 이러한 업데이트가 이전 버전에서 실행 중인 기존 코드와 호환되는지 확인하십시오.

애플리케이션 역할 정보

기본적으로 컨슈머는 애플리케이션 내에서 생성된 오브젝트에 대한 권한이 없습니다. 심지어 ACCOUNTADMIN 역할은 애플리케이션 내의 오브젝트를 볼 수 없습니다. 애플리케이션이 그 자신의 외부에서 생성하는 오브젝트(예: 데이터베이스)는 컨슈머 계정의 ACCOUNTADMIN 역할에만 표시됩니다.

애플리케이션 역할은 데이터베이스 역할과 유사하지만, 애플리케이션 내에서만 생성할 수 있습니다. 데이터베이스 역할과 달리, 애플리케이션 역할은 애플리케이션 외부에 존재하는 오브젝트에 대한 권한을 부여받을 수 있습니다.

애플리케이션 설치 시 설정 스크립트로 애플리케이션 역할을 생성해야 하며 이 역할은 애플리케이션 소유자의 역할에 자동으로 부여됩니다. 그러면 소유자가 적절한 애플리케이션 역할을 컨슈머 계정의 다른 역할에 부여할 수 있습니다.

참고

애플리케이션 역할은 애플리케이션 내에서 생성할 수 있는 유일한 유형의 역할입니다. 예를 들어 데이터베이스 역할은 애플리케이션 내에서 허용되지 않습니다.

마찬가지로, 애플리케이션 역할은 예컨대 일반 데이터베이스나 계정 수준이 아닌 애플리케이션에서만 만들 수 있습니다.

애플리케이션 역할에 부여된 모든 권한은 애플리케이션을 설치하는 데 사용되는 역할인 애플리케이션 소유자에게 전달됩니다. 소유자는 애플리케이션 역할을 컨슈머 계정 내의 다른 역할에 추가로 위임할 수 있습니다.

데이터베이스 역할과 달리, 설치된 애플리케이션 외부의 오브젝트에 대한 권한이 애플리케이션 역할에도 부여될 수 있습니다. 따라서 애플리케이션 외부의 오브젝트에 대한 권한을 부여하는 데 이러한 역할을 사용할 수 있습니다. 하지만 애플리케이션 역할 자체는 애플리케이션 내에서 생성해야 합니다.

애플리케이션 역할로 작업하기 위해 지원되는 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;
Copy

이 예에서 설정 스크립트는 adminuser 라는 애플리케이션 역할을 생성합니다. 그런 다음 설정 스크립트는 두 애플리케이션 역할에 모두 애플리케이션 코드가 포함된 스키마에 액세스할 권한을 부여합니다. 또한 스키마 내에서 add 함수에 대한 액세스 권한을 부여합니다. admin 역할에 config_app 프로시저에 대한 액세스 권한도 부여됩니다.

애플리케이션 역할 및 버전

애플리케이션 역할은 버전이 지정되지 않습니다. 즉, 애플리케이션 역할을 삭제하거나 버전이 지정된 스키마에 없는 오브젝트에서 권한을 취소하면 애플리케이션의 현재 버전이나 업그레이드 중인 버전에 영향을 미칠 수 있습니다. 애플리케이션 역할은 해당 역할을 사용하는 모든 애플리케이션 버전을 삭제한 경우에만 안전하게 삭제할 수 있습니다.

참고

애플리케이션 역할에는 오브젝트의 소유권을 부여할 수 없습니다. 즉, 설정 스크립트에 정의된 애플리케이션 역할은 컨슈머가 설치된 Snowflake Native App 내의 오브젝트에 액세스할 수 있도록 허용할 목적으로만 사용해야 한다는 뜻입니다.