Microsoft SQL Server 설정

Microsoft SQL Server 설정

dbt-sqlserver 어댑터의 설정을 정리한 페이지예요. materialization, 시드 배치, 스냅샷 제약, 인덱스, 권한 관리, cross-database 매크로 등 SQL Server에서 dbt를 쓸 때 알아야 할 사항을 소개해요.

출처: dbt 공식 문서

본문

Materializations

T-SQL이 중첩 CTE를 지원하지 않아서 ephemeral materialization은 지원되지 않아요. 아주 단순한 ephemeral 모델을 다룰 때는 일부 경우에 동작할 수도 있어요.

테이블

테이블은 기본적으로 columnstore 테이블로 materialize돼요. 이를 위해 온프레미스 인스턴스는 SQL Server 2017 이상, Azure는 서비스 티어 S2 이상이 필요해요.

이 동작은 as_columnstore 구성 옵션을 False로 설정해 비활성화할 수 있어요.

모델 설정

models/example.sql

{{
    config(
        as_columnstore=false
        )
}}

select *
from ...

프로젝트 설정

dbt_project.yml

models:
  your_project_name:
    materialized: view
    staging:
      materialized: table
      as_columnstore: False

시드

기본적으로 dbt-sqlserver는 시드 파일을 400행 단위 배치로 삽입하려고 시도해요. 이 값이 SQL Server의 2100 파라미터 제한을 초과하면 어댑터는 자동으로 가능한 최대 안전값으로 제한해요.

다른 기본 시드 값을 설정하려면 프로젝트 설정에서 max_batch_size 변수를 설정할 수 있어요.

dbt_project.yml

vars:
  max_batch_size: 200 # Any integer less than or equal to 2100 will do.

스냅샷

소스 테이블의 컬럼에는 제약 조건이 없어야 해요. 예를 들어 어떤 컬럼에 NOT NULL 제약 조건이 있으면 오류가 발생해요.

인덱스

테이블용 인덱스를 지정하려면 목적에 맞게 만들어진 매크로를 호출하는 post-hooks를 지정할 수 있어요.

다음 매크로를 사용할 수 있어요.

  • create_clustered_index(columns, unique=False): columns는 컬럼 목록이고, unique는 선택적 불리언(기본값 False)이에요.
  • create_nonclustered_index(columns, includes=columns): columns는 컬럼 목록이고, includes는 인덱스에 포함할 선택적 컬럼 목록이에요.
  • drop_all_indexes_on_table(): 테이블의 현재 인덱스를 모두 제거해요. 모델이 incremental일 때만 의미가 있어요.

몇 가지 예시:

models/example.sql

{{
    config({
        "as_columnstore": false,
        "materialized": 'table',
        "post-hook": [
            "{{ create_clustered_index(columns = ['row_id', 'row_id_complement'], unique=True) }}",
            "{{ create_nonclustered_index(columns = ['modified_date']) }}",
            "{{ create_nonclustered_index(columns = ['row_id'], includes = ['modified_date']) }}",
        ]
    })

}}

select *
from ...

자동 프로비저닝 권한 (Grants)

dbt 1.2부터 grants 설정 옵션으로 접근을 부여/회수할 수 있게 됐어요. dbt-sqlserver에서는 Azure SQL Database나 Azure Synapse Dedicated SQL Pool에서 Microsoft Entra ID 인증을 쓴다면 모델 설정에 auto_provision_aad_principalstrue로 추가로 설정할 수 있어요.

이렇게 하면 Microsoft Entra ID principal이 데이터베이스에 아직 없으면 자동으로 만들어요. principal이 Microsoft Entra ID에 존재해야 한다는 점에 주의해요. 이 설정은 그 principal을 데이터베이스에서 사용 가능하도록 만드는 것뿐이에요.

grants 설정에서 제거돼도 principal은 다시 제거되지 않아요.

dbt_project.yml

models:
  your_project_name:
    auto_provision_aad_principals: true

권한

dbt를 실행하는 사용자에게 다음 권한이 필요해요.

  • 데이터베이스 레벨 CREATE SCHEMA (또는 스키마를 미리 만들 수 있어요)
  • 데이터베이스 레벨 CREATE TABLE (또는 스키마가 이미 만들어졌다면 사용자 자신의 스키마에)
  • 데이터베이스 레벨 CREATE VIEW (또는 스키마가 이미 만들어졌다면 사용자 자신의 스키마에)
  • dbt 소스로 쓰이는 테이블/뷰에 대한 SELECT

dbt에서 테스트나 스냅샷을 사용하려면 위 3개의 CREATE 권한이 데이터베이스 레벨에서 필요해요. 테스트와 스냅샷에 쓰일 스키마를 미리 만들고 올바른 역할을 부여하면 이 제한을 우회할 수 있어요.

cross-database 매크로

다음 매크로는 현재 지원되지 않아요.

  • bool_or
  • array_construct
  • array_concat
  • array_append

dbt-utils

많은 dbt-utils 매크로가 지원되지만, tsql_utils dbt 패키지 설치가 필요해요.

더 알아보기 (Learn more)