참조를 사용하여 오브젝트에 대한 액세스 권한 부여하기

참조를 사용하면 기본적으로 특정 오브젝트에 액세스할 수 없는 저장 프로시저, 애플리케이션 또는 클래스 인스턴스에 대해 해당 오브젝트에 액세스할 권한을 부여할 수 있습니다.

이 항목의 내용:

소개

참조는 식별자로 사용할 수 있는 문자열입니다. 식별자는 참조되는 오브젝트로 확인됩니다.

참조는 다음을 캡슐화합니다.

  • 오브젝트 이름.

  • 해당하는 경우 오브젝트 참조를 생성하는 데 사용되는 활성 역할과 모든 활성 보조 역할.

  • 참조가 생성될 때 지정된 오브젝트에 대한 권한.

참조가 필요할 수 있는 몇 가지 시나리오는 다음과 같습니다.

  • 소유자 권한 저장 프로시저 에 다른 역할이 소유한 테이블에 데이터를 삽입하기 위한 액세스 권한이 필요합니다.

  • 애플리케이션이 데이터 분석을 수행하며 테이블의 데이터에 대한 읽기 액세스 권한이 필요합니다.

  • SNOWFLAKE.ML.ANOMALY_DETECTION 클래스의 인스턴스에 변칙 검색 ML 모델을 학습시키기 위해 뷰에 대한 읽기 액세스 권한이 필요합니다.

이름으로 식별되는 오브젝트

참조는 이름으로 오브젝트를 식별합니다. 이는 참조가 생성된 후 오브젝트 이름이 바뀌면 해당 참조가 유효하지 않음을 의미합니다. 그러나 동일한 이름을 가진 새 오브젝트가 생성되면 참조가 유효할 수 있습니다. 예를 들어 my_role 역할은 SELECT 권한으로 테이블 my_table1 에 대한 참조 my_ref1 을 생성합니다. 참조가 생성된 후 테이블 my_table1 이 삭제되고 my_table1 이라는 테이블이 생성됩니다. 참조 my_ref1 은 이름이 my_table1 인 테이블을 식별합니다. 이 경우 테이블 my_table1 을 식별합니다.

참조를 생성하는 데 사용된 역할과 my_table1 에 부여된 권한이 여전히 유효한 경우 참조를 사용할 때 새 my_table1 에 대한 액세스 권한이 부여됩니다.

참조에 캡슐화된 역할과 권한이 더 이상 유효하지 않으면 my_table1 테이블에 대한 액세스 권한을 부여할 수 없으며 새 테이블에 대해 새 참조를 생성해야 합니다.

실행 시 확인되는 권한

참조를 생성한 역할에 부여된 권한은 참조가 사용될 때 확인됩니다. 예를 들어 my_role 역할은 SELECT 권한으로 테이블 t1 에 대한 참조를 생성합니다. my_role 이 삭제되거나 테이블 t1 에 대한 SELECT 권한이 my_role 에서 취소되면 참조에 캡슐화된 권한이 더 이상 유효하지 않습니다. 테이블에 대한 SELECT 권한이 필요한 저장 프로시저에 참조가 전달되면 저장 프로시저가 권한 오류로 실패합니다.

참조 유형 및 참조 수명

참조의 수명은 생성 시에 지정할 수 있습니다.

  • 일시적 참조 는 참조가 전달되는 호출 기간 또는 세션 기간 동안 제한된 수명을 갖습니다.

  • 영구적 참조 는 수명이 무제한입니다. 참조는 참조하는 오브젝트가 삭제되거나, 참조가 설정 해제되거나, 참조가 유효하지 않게 될 때까지 유효한 상태로 유지됩니다.

    참조 설정 해제의 예는 애플리케이션에 대한 영구적 참조 설정 해제하기 섹션을 참조하십시오.

    다음과 같은 이유로 참조가 유효하지 않게 될 수 있습니다.

    • 참조하는 오브젝트의 이름이 바뀝니다.

    • 참조를 생성한 역할이 삭제됩니다.

    • 참조를 생성한 역할에 더 이상 오브젝트에 대한 권한이 없습니다.

    자세한 내용은 이름으로 식별되는 오브젝트실행 시 확인되는 권한 섹션을 참조하십시오.

소유자 권한 저장 프로시저에 대한 참조

소유자 권한 저장 프로시저 는 저장 프로시저를 실행하는 호출자 의 권한이 아닌 소유자 의 권한으로 실행됩니다. 호출자는 자신에게 액세스할 권한이 있는 테이블, 뷰 또는 함수에 대한 작업을 수행하려면 테이블, 뷰 또는 함수에 대한 참조를 전달해야 합니다. 참조를 사용하면 저장 프로시저가 참조 생성자(이 경우에는 호출자)의 권한으로 참조가 식별하는 오브젝트에 대한 작업을 수행할 수 있습니다.

애플리케이션과 클래스에 대한 참조

설계상, 애플리케이션과 클래스는 애플리케이션이 설치되거나 클래스의 인스턴스가 생성되는 계정의 오브젝트에 액세스할 수 없습니다. 사용자는 참조를 생성하여 애플리케이션 또는 클래스 인스턴스에 오브젝트 액세스 권한을 부여할 수 있습니다.

애플리케이션과 클래스의 공급자와 컨슈머

공급자 는 애플리케이션을 만들고 컨슈머 는 컨슈머 계정에 애플리케이션을 설치하고 사용합니다. Snowflake 클래스 의 경우 Snowflake가 공급자 이고 클래스의 인스턴스를 생성하는 Snowflake 계정이 있는 사용자가 컨슈머 입니다.

공급자는 코드에서 참조를 요청하고 사용하는 애플리케이션과 클래스를 만들 수 있습니다. 자세한 내용은 공급자를 위한 참조 섹션을 참조하십시오.

컨슈머는 자신의 계정에 설치하는 애플리케이션이나 Snowflake 클래스 인스턴스에 대한 참조를 생성하고 전달할 수 있습니다. 자세한 내용은 컨슈머를 위한 참조 섹션을 참조하십시오.

참조의 지원 대상

참조의 대상은 오브젝트 또는 쿼리일 수 있습니다. 참조의 대상이 오브젝트인 경우 참조를 위해서는 해당 오브젝트에 대한 권한이 필요합니다.

참조의 지원 오브젝트 유형과 권한

다음 표에는 참조에 포함될 수 있는 오브젝트 유형, 생성할 수 있는 참조의 유형, 각 오브젝트에 허용되는 권한이 나열되어 있습니다.

오브젝트 타입

일시적

지속적

허용되는 권한

기본 권한

DATABASE

APPLYBUDGET

SCHEMA

APPLYBUDGET

TABLE

APPLYBUDGET

SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES

SELECT

VIEW

SELECT, REFERENCES

SELECT

MATERIALIZED VIEW

APPLYBUDGET

EXTERNAL TABLE

SELECT, REFERENCES

SELECT

PIPE

APPLYBUDGET

APPLYBUDGET

TASK

APPLYBUDGET

APPLYBUDGET

FUNCTION

USAGE

USAGE

PROCEDURE

USAGE

USAGE

WAREHOUSE

APPLYBUDGET

MODIFY, MONITOR, OPERATE, USAGE

USAGE

API INTEGRATION

USAGE

USAGE

쿼리 참조

쿼리 참조 는 일시적 참조 유형입니다. 저장 프로시저에 있는 다른 SQL 문의 FROM 절에서 사용할 수 있는 SELECT 문을 참조합니다. SYSTEM$QUERY_REFERENCE 함수를 사용하여 쿼리 참조를 생성할 수 있습니다.

자세한 내용은 쿼리 참조 사용하기 섹션을 참조하십시오.

공급자를 위한 참조

Snowflake Native App Framework 를 사용하여 애플리케이션을 공급자로 만들 수 있습니다. 애플리케이션의 컨슈머로부터 참조를 요청하는 방법에 대한 자세한 내용은 컨슈머로부터 참조 및 오브젝트 수준 권한 요청하기 섹션을 참조하십시오.

컨슈머를 위한 참조

SYSTEM$REFERENCE 함수를 사용하여 참조를 생성할 수 있습니다. 함수가 저장 프로시저, 애플리케이션 또는 클래스 인스턴스에 반환하는 문자열 식별자를 전달할 수 있습니다. 또는 문자열 식별자 대신 참조를 생성하는 문을 전달할 수 있습니다.

SELECT 권한을 사용하여 테이블 t1 에 대한 세션 범위의 일시적 참조를 만듭니다.

SELECT SYSTEM$REFERENCE('TABLE', 't1', 'SESSION', 'SELECT');
Copy

참조되는 범위의 수명 동안 동일한 테이블에 대한 참조를 만들려면(예: 참조를 저장 프로시저에 전달하는 경우 참조의 수명은 저장 프로시저의 가장 바깥쪽 블록의 수명이 됨) 다음 문을 실행하십시오.

SELECT SYSTEM$REFERENCE('TABLE', 't1', 'CALL', 'SELECT');
Copy

애플리케이션에 전달할 INSERT 권한이 있는 테이블 t1 에 대한 영구적 참조를 만듭니다.

SELECT SYSTEM$REFERENCE('TABLE', 't1', 'PERSISTENT', 'INSERT');
Copy

저장 프로시저에 전달할 쿼리 참조를 만듭니다. 이 일시적 참조의 수명은 참조를 전달하는 대상 저장 프로시저의 가장 바깥쪽 블록의 수명입니다.

SELECT SYSTEM$QUERY_REFERENCE('SELECT id FROM my_table', FALSE);
Copy

추가적인 예는 다음을 참조하십시오.

애플리케이션에 대한 영구적 참조 설정 해제하기

영구적 참조가 필요한 애플리케이션이나 클래스는 참조를 설정 해제하는 메서드도 제공합니다. 메서드 이름은 구현에 따라 다를 수 있습니다.

ALTER APPLICATION … UNSET REFERENCES 문을 사용하여 참조를 설정 해제할 수 있습니다.

  1. SHOW REFERENCES 명령을 사용하면 애플리케이션에 대해 설정된 참조를 포함한 모든 참조를 볼 수 있습니다.

    예를 들어 my_app 애플리케이션에 대한 참조를 보려면 다음을 수행하십시오.

    SHOW REFERENCES IN APPLICATION my_app;
    
    Copy
  2. ALTER APPLICATION 명령을 사용하여 애플리케이션에 대해 설정된 모든 참조를 설정 해제할 수 있습니다.

    예를 들어 애플리케이션 my_app 에서 table_to_read 라는 참조를 설정 해제하려면 다음을 수행하십시오.

    ALTER APPLICATION my_app UNSET REFERENCES('table_to_read');
    
    Copy

    예를 들어 my_app 애플리케이션에서 모든 참조를 설정 해제하려면 다음을 수행하십시오.

    ALTER APPLICATION my_app UNSET REFERENCES;
    
    Copy

참조 사용 시 고려 사항

  • 참조와 연결된 오브젝트의 이름이 바뀌거나 상위 항목이 바뀌면 해당 참조는 더 이상 유효하지 않습니다.

    동일한 이름으로 새 오브젝트가 생성되고 참조 연결에 인코딩된 역할이 새 오브젝트에 대한 관련 권한을 갖는 경우 참조는 유효한 상태로 유지됩니다. 그렇지 않으면 권한 오류로 인해 실패합니다.

  • 오브젝트가 바뀌고 참조 연결에 인코딩된 역할이 이제는 바뀐 이름을 갖는 새 오브젝트에 대한 관련 권한이 있는 경우 참조는 유효한 상태로 유지됩니다. 그렇지 않으면 권한 오류로 인해 실패합니다.

  • 오브젝트 삭제 및 삭제 취소:

    • 참조와 연결된 오브젝트가 삭제되면 참조 연결이 유효하지 않게 됩니다.

    • 오브젝트 삭제가 취소되면 참조 연결이 다시 유효해집니다.

  • 복제

    계정의 오브젝트에 대한 참조를 사용하는 클래스 인스턴스나 해당 상위 데이터베이스 또는 스키마를 복제할 수 있습니다.

    • 참조 오브젝트가 정규화된 이름으로 참조되는 경우 인스턴스 복제본은 원본 오브젝트를 참조합니다.

    • 참조된 오브젝트가 부분적으로 정규화되거나 정규화되지 않은 이름으로 참조되는 경우 인스턴스 복제본은 복제 경계에 따라 복제본 오브젝트나 원본 오브젝트를 참조하거나 실제 오브젝트가 아닌 오브젝트를 참조할 수 있습니다.

  • 복제는 컨슈머 계정의 오브젝트에 대한 참조를 사용하는 클래스 인스턴스가 포함된 데이터베이스 또는 애플리케이션에 대해 지원됩니다.

    다음 오브젝트가 복제되는 한 참조는 대상 계정에서 올바르게 작동합니다.

    • 애플리케이션 또는 클래스 인스턴스.

    • 참조되는 오브젝트.

    • 참조를 생성한 역할.

    이러한 오브젝트는 다른 복제 또는 장애 조치 그룹에 복제될 수 있습니다. 모든 오브젝트가 복제되면 참조를 사용할 수 있습니다.

Snowflake Native App Framework 애플리케이션 공급자에 대해서는 참조 사용 시 고려 사항 섹션도 참조하십시오.

참조 사용 모니터링하기

SHOW REFERENCES 명령을 사용하여 애플리케이션에서 요청한 참조를 확인할 수 있습니다. 애플리케이션에 대한 참조를 설정한 경우 출력에는 오브젝트, 데이터베이스, 스키마 및 각 참조의 식별자에 대한 정보가 포함됩니다.

예를 들어 my_app 애플리케이션에서 참조를 보려면 다음을 수행하십시오.

SHOW REFERENCES IN APPLICATION my_app;
Copy