📖 Scenario: You work as a data analyst in a company that uses dbt to manage data transformations. Your team wants to ensure that data models meet certain quality standards and that only authorized users can access sensitive data.To achieve this, you will create model contracts to enforce data quality and set up access controls to restrict who can query specific models.
🎯 Goal: Build a dbt project that defines a model with a contract enforcing a non-null constraint on a column and configure access controls to limit access to this model.
📋 What You'll Learn
Create a dbt model named orders with sample data
Define a model contract that enforces order_id is not null
Set a config variable allowed_roles with roles allowed to access the model
Apply access control logic in the model using the allowed_roles variable
Print the final SQL code of the model showing the contract and access control
💡 Why This Matters
🌍 Real World
Model contracts help ensure data quality by enforcing rules on data columns. Access controls protect sensitive data by restricting who can query models.
💼 Career
Data engineers and analysts use dbt model contracts and access controls to maintain trustworthy data pipelines and comply with data governance policies.
Progress0 / 4 steps
1
Create the orders model with sample data
Create a dbt model file named orders.sql with a simple SELECT statement that returns these columns and values: order_id with values 1, 2, 3 and customer_name with values 'Alice', 'Bob', 'Charlie'.
dbt
Hint
Use a SELECT statement with UNION ALL to create three rows with order_id and customer_name.
2
Define the allowed_roles config variable
In the same orders.sql file, add a dbt config block at the top that defines a variable called allowed_roles with the list ['analyst', 'data_engineer'].
dbt
Hint
Use the config Jinja function at the top of the model file to set allowed_roles.
3
Add a model contract to enforce order_id is not null
Below the config block, add a contract block that enforces the order_id column is not null using not_null: true.
dbt
Hint
Use the contract Jinja function with a columns list specifying order_id with not_null: true.
4
Print the final model SQL code
Print the entire content of the orders.sql model file to show the config, contract, and SELECT statement.
dbt
Hint
Use a print statement to output the full model SQL content exactly as written.
Practice
(1/5)
1. What is the main purpose of a model contract in dbt?
easy
A. To schedule when models run in dbt Cloud
B. To define rules that ensure data quality in models
C. To control who can access the dbt project files
D. To create visual dashboards from model data
Solution
Step 1: Understand what a model contract does
A model contract sets rules that data must follow to be considered valid in dbt models.
Step 2: Compare options to the definition
Only To define rules that ensure data quality in models describes defining rules for data quality, which matches the purpose of model contracts.
Final Answer:
To define rules that ensure data quality in models -> Option B
Quick Check:
Model contract = data quality rules [OK]
Hint: Model contracts = rules for data quality [OK]
Common Mistakes:
Confusing access control with model contracts
Thinking contracts schedule runs
Mixing contracts with visualization tools
2. Which of the following is the correct syntax to define a model contract in a dbt model's schema.yml file?
easy
A. models:
- name: my_model
access_control:
users:
- admin
C. models:
- name: my_model
contract:
columns:
- name: id
tests:
- not_null
D. models:
- name: my_model
dashboard:
enabled: true
Solution
Step 1: Identify the syntax for model contracts in schema.yml
Model contracts are defined under the contract key with column tests inside schema.yml.
Step 2: Match options to this syntax
models:
- name: my_model
contract:
columns:
- name: id
tests:
- not_null correctly shows contract with columns and tests. Others show unrelated keys like access_control, schedule, or dashboard.
Final Answer:
models:
- name: my_model
contract:
columns:
- name: id
tests:
- not_null -> Option C
But analysts report they cannot see the customers model. What is the likely error?
medium
A. The access_control block is not supported in dbt_project.yml
B. The role name 'analyst' is misspelled
C. The models list must be under each model, not role
D. The customers model does not exist in the project
Solution
Step 1: Check where access controls are defined in dbt
dbt does not support an access_control block in dbt_project.yml. Access controls are managed outside or via external tools.
Step 2: Analyze other options
Role spelling or model existence might cause issues, but the main problem is unsupported syntax in the config file.
Final Answer:
The access_control block is not supported in dbt_project.yml -> Option A
Quick Check:
Access control block unsupported = The access_control block is not supported in dbt_project.yml [OK]
Hint: Access controls not set in dbt_project.yml [OK]
Common Mistakes:
Trying to set access control inside dbt_project.yml
Assuming role names cause access issues
Not verifying model existence
5. You want to enforce that only users with the 'data_engineer' role can modify the finance model, and that the model must always have a non-null transaction_id. How can you combine model contracts and access controls to achieve this?
hard
A. Define a model contract in schema.yml for transaction_id not null, and manage access control via your data platform's permissions for 'data_engineer' role
B. Add an access control block in schema.yml restricting 'finance' model to 'data_engineer', and add a contract test for transaction_id
C. Use a dbt macro to check user role inside the model SQL and raise error if not 'data_engineer', plus contract test for transaction_id
D. Set transaction_id as primary key in the database and assign 'data_engineer' role ownership on the model
Solution
Step 1: Use model contracts for data quality
Define a contract test in schema.yml to ensure transaction_id is not null, enforcing data quality.
Step 2: Manage access control outside dbt
dbt does not handle user permissions directly; access control is managed by your data platform or warehouse permissions for the 'data_engineer' role.
Final Answer:
Define a model contract in schema.yml for transaction_id not null, and manage access control via your data platform's permissions for 'data_engineer' role -> Option A
Quick Check:
Contracts for data rules + external access control = Define a model contract in schema.yml for transaction_id not null, and manage access control via your data platform's permissions for 'data_engineer' role [OK]
Hint: Use contracts for data, platform for access control [OK]
Common Mistakes:
Trying to set access control inside dbt schema.yml
Using macros to check user roles inside SQL
Assuming dbt manages user permissions directly
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.