Access History in Snowflake is a feature that records detailed information about user activities, such as queries run, objects accessed, and the time of access. It helps track who did what and when in your Snowflake account.
Click to reveal answer
beginner
How does Snowflake Audit Logging help in security?
Audit Logging captures all account-level events like login attempts, role changes, and data access. This helps detect unauthorized access, monitor compliance, and investigate security incidents.
Click to reveal answer
intermediate
Which Snowflake view provides access history details?
The view named ACCESS_HISTORY in the SNOWFLAKE.ACCOUNT_USAGE schema provides detailed records of user access to objects, including query IDs, user names, and timestamps.
Click to reveal answer
intermediate
What is the retention period for Access History data in Snowflake?
By default, Access History data is retained for 1 year in Snowflake, allowing long-term auditing and analysis of user activities.
Click to reveal answer
intermediate
How can you query audit logs in Snowflake?
You can query audit logs by selecting from the SNOWFLAKE.ACCOUNT_USAGE.LOGIN_HISTORY and QUERY_HISTORY views to see login events and query executions respectively.
Click to reveal answer
Which Snowflake schema contains the ACCESS_HISTORY view?
ASNOWFLAKE.DATABASES
BINFORMATION_SCHEMA
CSNOWFLAKE.ACCOUNT_USAGE
DPUBLIC
✗ Incorrect
The ACCESS_HISTORY view is located in the SNOWFLAKE.ACCOUNT_USAGE schema.
What type of events does Snowflake Audit Logging NOT capture?
AUser login attempts
BQuery executions
CRole changes
DLocal machine file changes
✗ Incorrect
Audit Logging captures Snowflake account events, not changes on local machines.
How long is Access History data retained by default in Snowflake?
A1 year
B90 days
CIndefinitely
D30 days
✗ Incorrect
Access History data is retained for 1 year by default.
Which view would you query to see user login events in Snowflake?
AACCESS_HISTORY
BLOGIN_HISTORY
CQUERY_HISTORY
DSESSION_HISTORY
✗ Incorrect
LOGIN_HISTORY view shows user login events.
What is the main purpose of Access History in Snowflake?
ATo track user activities and data access
BTo store user passwords
CTo manage database backups
DTo optimize query performance
✗ Incorrect
Access History tracks user activities and data access for auditing.
Explain how Access History and Audit Logging help maintain security in Snowflake.
Think about what information is recorded and why it matters for security.
You got /5 concepts.
Describe how you would find out who accessed a specific table in Snowflake using audit logs.
Focus on which views to use and what filters to apply.
You got /5 concepts.
Practice
(1/5)
1. What does the ACCESS_HISTORY view in Snowflake primarily provide?
easy
A. Information about who accessed data and when
B. Details about Snowflake account billing
C. List of all database tables and schemas
D. Performance metrics of queries
Solution
Step 1: Understand the purpose of ACCESS_HISTORY
The ACCESS_HISTORY view records user activity related to data access in Snowflake.
Step 2: Identify what ACCESS_HISTORY tracks
It tracks who accessed what data and when, useful for audit and compliance.
Final Answer:
Information about who accessed data and when -> Option A
Quick Check:
ACCESS_HISTORY = Data access logs [OK]
Hint: ACCESS_HISTORY logs user data access events only [OK]
Common Mistakes:
Confusing ACCESS_HISTORY with billing or performance views
Thinking it shows database structure
Assuming it tracks query performance
2. Which of the following is the correct syntax to query the ACCESS_HISTORY view for all accesses in the last 7 days?
easy
A. SELECT * FROM ACCESS_HISTORY WHERE ACCESS_TIME = CURRENT_DATE - 7;
B. SELECT * FROM ACCESS_HISTORY WHERE ACCESS_TIME < CURRENT_DATE + 7;
C. SELECT * FROM ACCESS_HISTORY WHERE ACCESS_TIME > CURRENT_DATE - 7;
D. SELECT * FROM ACCESS_HISTORY WHERE ACCESS_TIME BETWEEN CURRENT_DATE AND CURRENT_DATE + 7;
Solution
Step 1: Understand date filtering in Snowflake SQL
To get records from the last 7 days, filter where ACCESS_TIME is greater than current date minus 7 days.
Step 2: Check each option's date condition
SELECT * FROM ACCESS_HISTORY WHERE ACCESS_TIME > CURRENT_DATE - 7; correctly uses ACCESS_TIME > CURRENT_DATE - 7 to get recent records.
Final Answer:
SELECT * FROM ACCESS_HISTORY WHERE ACCESS_TIME > CURRENT_DATE - 7; -> Option C
Quick Check:
Date filter for last 7 days = SELECT * FROM ACCESS_HISTORY WHERE ACCESS_TIME > CURRENT_DATE - 7; [OK]
Hint: Use > CURRENT_DATE - 7 for last 7 days filter [OK]
Common Mistakes:
Using < instead of > for recent dates
Using = which matches only one day
Using BETWEEN with future dates incorrectly
3. What will be the result of this query?
SELECT USER_NAME, COUNT(*) AS ACCESS_COUNT
FROM ACCESS_HISTORY
WHERE OBJECT_NAME = 'CUSTOMERS'
GROUP BY USER_NAME
ORDER BY ACCESS_COUNT DESC
LIMIT 3;
medium
A. All users who accessed any object named CUSTOMERS
B. An error because OBJECT_NAME is not a valid column
C. The total number of accesses to all objects
D. Top 3 users who accessed the CUSTOMERS object most frequently
Solution
Step 1: Analyze the query components
The query counts accesses per user filtered by OBJECT_NAME = 'CUSTOMERS'.
Step 2: Understand GROUP BY and ORDER BY
It groups by USER_NAME, orders by count descending, and limits to top 3 users.
Final Answer:
Top 3 users who accessed the CUSTOMERS object most frequently -> Option D
Quick Check:
GROUP BY USER_NAME with LIMIT 3 = Top 3 users who accessed the CUSTOMERS object most frequently [OK]
Hint: GROUP BY user and LIMIT 3 shows top 3 users [OK]
Common Mistakes:
Thinking it lists all users without limit
Assuming OBJECT_NAME is invalid
Confusing total accesses with per-user counts
4. You run this query but get an error:
SELECT * FROM ACCESS_HISTORY WHERE USER = 'JOHN';
What is the likely cause and fix?
medium
A. Column USER does not exist; use USER_NAME instead
B. ACCESS_HISTORY view is not accessible to your role
C. Syntax error due to missing semicolon
D. USER is a reserved keyword; enclose in double quotes
Solution
Step 1: Check column names in ACCESS_HISTORY
The correct column for user is USER_NAME, not USER.
Step 2: Correct the query column name
Replace USER with USER_NAME to fix the error.
Final Answer:
Column USER does not exist; use USER_NAME instead -> Option A
Quick Check:
Use USER_NAME column, not USER [OK]
Hint: Use USER_NAME, not USER, as column name [OK]
Common Mistakes:
Using USER instead of USER_NAME
Assuming missing semicolon causes error
Thinking ACCESS_HISTORY is inaccessible
5. You want to audit all SELECT queries on the SALES table in the last 30 days. Which query correctly retrieves this from ACCESS_HISTORY?
hard
A. SELECT QUERY_TEXT, USER_NAME FROM ACCESS_HISTORY WHERE OBJECT_NAME = 'SALES' AND ACCESS_TYPE = 'INSERT' AND ACCESS_TIME > CURRENT_DATE - 30;
B. SELECT QUERY_TEXT, USER_NAME, ACCESS_TIME FROM ACCESS_HISTORY WHERE OBJECT_NAME = 'SALES' AND ACCESS_TYPE = 'SELECT' AND ACCESS_TIME > CURRENT_DATE - 30;
C. SELECT * FROM ACCESS_HISTORY WHERE TABLE_NAME = 'SALES' AND QUERY_TYPE = 'SELECT' AND ACCESS_TIME > CURRENT_DATE - 30;
D. SELECT QUERY_TEXT, USER_NAME FROM ACCESS_HISTORY WHERE OBJECT_NAME = 'SALES' AND ACCESS_TIME < CURRENT_DATE - 30;
Solution
Step 1: Identify correct column names and filters
ACCESS_HISTORY uses OBJECT_NAME for table, ACCESS_TYPE for operation, and ACCESS_TIME for timestamp.
Step 2: Check filter conditions for SELECT and last 30 days
SELECT QUERY_TEXT, USER_NAME, ACCESS_TIME FROM ACCESS_HISTORY WHERE OBJECT_NAME = 'SALES' AND ACCESS_TYPE = 'SELECT' AND ACCESS_TIME > CURRENT_DATE - 30; filters OBJECT_NAME = 'SALES', ACCESS_TYPE = 'SELECT', and ACCESS_TIME > CURRENT_DATE - 30 correctly.
Final Answer:
SELECT QUERY_TEXT, USER_NAME, ACCESS_TIME FROM ACCESS_HISTORY WHERE OBJECT_NAME = 'SALES' AND ACCESS_TYPE = 'SELECT' AND ACCESS_TIME > CURRENT_DATE - 30; -> Option B
Quick Check:
Correct columns and filters = SELECT QUERY_TEXT, USER_NAME, ACCESS_TIME FROM ACCESS_HISTORY WHERE OBJECT_NAME = 'SALES' AND ACCESS_TYPE = 'SELECT' AND ACCESS_TIME > CURRENT_DATE - 30; [OK]
Hint: Filter by OBJECT_NAME, ACCESS_TYPE, and recent ACCESS_TIME [OK]
Common Mistakes:
Using TABLE_NAME or QUERY_TYPE which don't exist
Filtering for INSERT instead of SELECT
Using ACCESS_TIME < CURRENT_DATE - 30 (old data)
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.