dbt の access は、モデルを ref できる範囲を制御するプロパティで、設計段階の一貫性と変更の安全性を高めます。特にレイヤード・アーキテクチャ(staging / intermediate / marts)と組み合わせると、依存関係の境界が明確になり、拡張時の影響評価が容易になります。
本稿では public / protected / private の基本、よくある設計パターン、YAML 実装例、CI での検証ポイントをまとめます。dbt Analytics Engineer 認定の出題傾向(モデルの境界、contracts・versions との併用、grants との違い)にも触れます。
access は主にモデルで利用するリソースプロパティで、他のパッケージやプロジェクトからの ref 対象にできるかを制御します。dbt はコンパイル時に access 違反を検出し、意図しない参照をブロックします。
基本的な方針は、staging は private、統合・中間層は protected、消費者向けのマートは public です。これにより、変更の影響半径を段階的に抑えられます。
| レベル | 参照できる範囲(概念) | 主な用途と注意点 |
|---|---|---|
| private | 同一パッケージ内のみ | staging・試験的中間。再利用性は下がるが変更が安全 |
| protected | 同一パッケージ内(+定義した境界) | 統合・中間。外部からの直接参照を抑え、境界運用が重要 |
| public | 全パッケージから | マートや公開 API。変更は慎重に。versions/contract と併用推奨 |
もっとも実務で安定するのは、レイヤごとに access を固定するやり方です。これにより、意図しない逆参照やスキップ参照(stg → mart の直参照など)を抑止できます。
別パッケージからは mart の public のみを参照可能とし、int(protected)は境界外から触れない前提にします。
依存関係と公開境界(例)
以下は、同一プロジェクト内でレイヤごとに access と group を付与した例です。contracts と versions を組み合わせ、public モデルの安定性を高めます。
access 違反は dbt のコンパイル〜ビルド時に検出されます。CI では依存パッケージを含めて dbt build を実行し、違反でジョブを失敗させます。
models/schema.yml(例)
version: 2
models:
- name: stg_orders
description: Raw orders from source, lightly cleaned
config:
access: private
group: staging
contract:
enforced: true
columns:
- name: order_id
data_type: int
- name: order_ts
data_type: timestamp
- name: int_orders
description: Conformed orders, with keys and normalized types
config:
access: protected
group: integration
columns:
- name: order_id
tests: [not_null]
- name: dim_customers
description: Curated customer dimension (public interface)
config:
access: public
group: marts
contract:
enforced: true
versions:
- v: 1
- v: 2
latest_version: 2
columns:
- name: customer_id
data_type: int
- name: customer_tier
data_type: string
他パッケージから参照される前提のモデルは public に限定します。protected や private を外部から ref しようとすると、dbt はビルド前の段階で違反として検出します。
公開対象の変更時は、互換破壊と非互換を切り分けます。互換破壊は新しい version として提供し、latest_version を切り替えるまでの併走期間を設ける運用が安全です。
access は「dbt 内の参照可否」を制御します。データベースの読み取り権限は grants(アダプタ実装)で別管理です。public でも、倉庫側の権限が無ければ直接 SQL では読めません。
contracts はスキーマ整合性、versions はインターフェースの時間的互換性を担保します。public モデルでは3点セット(access+contract+version)が実運用・試験双方での模範解答に近いです。
Analytics Engineer 認定では、層ごとの公開範囲、access・contracts・versions の組み合わせ、grants との違いが頻出です。シナリオ文から「誰が使うか」「どこまで公開するか」を判断してください。
protected と private の違いを混同しないこと、public を安易に増やさないこと、破壊的変更時は versioning を使うことが要点です。
Analytics Engineer
問題 1
複数のチームが同一データプラットフォーム上で dbt プロジェクトを分離運用しています。Team A の中間層モデル int_orders は外部から直接参照してほしくありませんが、Team A 内では自由に参照したい。一方、顧客向けマート dim_customers は Team B からも参照されます。適切な access の組み合わせはどれですか。
正解: A
外部パッケージからの直接参照を防ぐ中間層は protected、外部公開のマートは public が適切。private は同一パッケージ内でも用途が限定されるため、中間層の共有には不向き。
access を設定すると、倉庫上の SELECT 権限も制御できますか?
いいえ。access は dbt の ref 可否を制御する設計上のガードです。倉庫上の権限は grants(アダプタ依存の実装)で管理します。
public モデルの破壊的変更はどう扱うべきですか?
versions を使って新バージョンとして提供し、contract を併用して互換性を明示します。依存側の移行期間を設け、latest_version の切替タイミングを管理します。
protected と private の実務上の使い分けは?
private は原材料や実験的な形を閉じ込める用途、protected は同一プロジェクト内での共有中間層に適します。外部公開は public のみに限定します。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
dbt Model の基礎: SQL で定義する変換の最小単位
Analytics Engineer 向けに、dbt Model の定義、マテリアライゼーション、依存関係、インクリメン...
dbt Analytics Engineer 試験ガイド: 出題範囲・配点・申込の実務視点
dbt Analytics Engineer 認定の出題範囲、配点の考え方、申込から受験までの流れを、公式ドキュメントの...
dbt Cloud と dbt Core の違いと選び方:Analytics Engineer 試験に効く要点
dbt Cloud と dbt Core の機能差を、実務と資格対策の両面から整理。スケジューリング、IDE、RBAC、...
dbt プロジェクト構造ガイド: models / seeds / macros の実務レイアウト
Analytics Engineer 向けに、dbt プロジェクトのディレクトリ構造と命名規約、dbt_project....
dbt_project.yml の読み方:主要設定と命名を最短で掴む
dbt_project.yml の必須キー、命名解決(database.schema.identifier)、設定優先度...