미리 정의된 구조/스키마가 없는 데이터
| 분류 | 예시 |
|---|---|
| Multi-media | Image, Audio, Video |
| Documents | PDF, Spreadsheet, Text |
Stage에 올린 비정형 파일에 접근하는 URL을 생성하는 함수들
비정형 파일 → PUT으로 STAGE에 적재 → File Function으로 URL 생성 → 파일 접근
PUT file://image.jpg @images_stage;
SELECT GET_PRESIGNED_URL(@images_stage, image.jpg);
| 함수 | URL 종류 | 만료 |
|---|---|---|
BUILD_SCOPED_FILE_URL | Scoped URL | 24시간 후 만료 |
BUILD_STAGE_FILE_URL | File(Stage) URL | 만료 없음 (영구) |
GET_PRESIGNED_URL | Pre-signed URL | 지정한 시간 후 만료 |
📍 공식 문서 추가:
GET_PRESIGNED_URL과BUILD_SCOPED_FILE_URL은 non-deterministic,
BUILD_STAGE_FILE_URL은 deterministic 함수
build_scoped_file_url( @<stage_name> , '<relative_file_path>' )
SELECT build_scoped_file_url(@images_stage, 'prod_z1c.jpg');
| 호출 방식 | 필요 권한 |
|---|---|
| Query에서 직접 호출 | external stage → USAGE / internal stage → READ |
| UDF / SP / View에서 호출 | 호출하는 role은 underlying stage 권한 불필요 ✅ |
직접 쿼리하면 stage 권한 필요, 객체(UDF/SP/View) 통해 호출하면 stage 권한 불필요
-- View로 감싸면 조회 role은 stage 권한 없이 접근 가능
CREATE VIEW PRODUCT_SCOPED_URL_VIEW AS
SELECT build_scoped_file_url(@images_stage, 'prod_z1c.jpg') AS scoped_file_url;
SELECT * FROM PRODUCT_SCOPED_URL_VIEW;
build_stage_file_url( @<stage_name> , '<relative_file_path>' )
SELECT build_stage_file_url(@images_stage, 'prod_z1c.jpg');
.../api/files/DB/SCHEMA/STAGE/파일명 (경로가 그대로 노출)호출 방식이 query/UDF/SP/View 무엇이든 관계없이
항상 underlying stage 권한 필요
→ external stage: USAGE / internal stage: READ
Scoped는 "객체로 감싸면 권한 불필요"였지만,
Stage URL은 언제나 stage 권한 필요가 핵심 차이!
get_presigned_url( @<stage_name> , '<relative_file_path>' , [ <expiration_time> ] )
SELECT get_presigned_url(@images_stage, 'prod_z1c.jpg', 600); -- 600초 후 만료
expiration_time(초) 지정 가능query/UDF/SP/View 무엇이든 항상 stage 권한 필요
external: USAGE / internal: READ
-- 1. 메타데이터 테이블 생성
CREATE TABLE document_metadata (
relative_path string, author string,
published_on date, topics array
);
-- 2. JSON 메타데이터 COPY INTO
COPY INTO document_metadata
FROM (SELECT $1:relative_path, $1:author, $1:published_on::date, $1:topics
FROM @documents_stage/document_metadata.json)
FILE_FORMAT = (type = json);
-- 3. presigned_url 포함 카탈로그 view
CREATE VIEW document_catalog AS (
SELECT author, published_on,
get_presigned_url(@documents_stage, relative_path) as presigned_url,
topics
FROM documents_table
);
| 항목 | BUILD_SCOPED | BUILD_STAGE | GET_PRESIGNED |
|---|---|---|---|
| 만료 | 24시간 | 만료 없음(영구) | 지정 시간(기본3600s/최대7일) |
| 객체로 감쌀 때 stage 권한 | 불필요 ✅ | 필요 | 필요 |
| 직접 쿼리 stage 권한 | 필요 | 필요 | 필요 |
| 브라우저 직접 접근 | REST API 필요 | REST API 필요 | 가능 ✅ |
| 결정성 | non-deterministic | deterministic | non-deterministic |