Reputation: 85
I am trying to create a stream on view that looks for the change in information_schema.query_history().
But getting an error below:
SQL compilation error: line 8 at position 11: Change tracking is not supported on queries with 'Built-in view'.
How to track the changes from built in view, any ideas please?
Upvotes: 0
Views: 1087
Reputation: 59165
As an alternative, you could create a table and a task that keeps updating it with changes in the view:
create or replace table track_queries
change_tracking = true
as
select *
from table(information_schema.query_history())
limit 0;
merge into track_queries using (
select *
from table(information_schema.query_history())
) as b
on track_queries.query_id = b.query_id
and track_queries.start_time = b.start_time
when matched and track_queries.end_time != b.end_time
then update
set BYTES_SCANNED=b.BYTES_SCANNED, COMPILATION_TIME=b.COMPILATION_TIME, CREDITS_USED_CLOUD_SERVICES=b.CREDITS_USED_CLOUD_SERVICES, DATABASE_NAME=b.DATABASE_NAME, END_TIME=b.END_TIME, EXECUTION_STATUS=b.EXECUTION_STATUS, EXECUTION_TIME=b.EXECUTION_TIME, EXTERNAL_FUNCTION_TOTAL_INVOCATIONS=b.EXTERNAL_FUNCTION_TOTAL_INVOCATIONS, EXTERNAL_FUNCTION_TOTAL_RECEIVED_BYTES=b.EXTERNAL_FUNCTION_TOTAL_RECEIVED_BYTES, EXTERNAL_FUNCTION_TOTAL_RECEIVED_ROWS=b.EXTERNAL_FUNCTION_TOTAL_RECEIVED_ROWS, EXTERNAL_FUNCTION_TOTAL_SENT_BYTES=b.EXTERNAL_FUNCTION_TOTAL_SENT_BYTES, EXTERNAL_FUNCTION_TOTAL_SENT_ROWS=b.EXTERNAL_FUNCTION_TOTAL_SENT_ROWS, INBOUND_DATA_TRANSFER_BYTES=b.INBOUND_DATA_TRANSFER_BYTES, IS_CLIENT_GENERATED_STATEMENT=b.IS_CLIENT_GENERATED_STATEMENT, LIST_EXTERNAL_FILE_TIME=b.LIST_EXTERNAL_FILE_TIME, OUTBOUND_DATA_TRANSFER_BYTES=b.OUTBOUND_DATA_TRANSFER_BYTES, QUERY_ID=b.QUERY_ID, QUERY_TAG=b.QUERY_TAG, QUERY_TEXT=b.QUERY_TEXT, QUERY_TYPE=b.QUERY_TYPE, QUEUED_OVERLOAD_TIME=b.QUEUED_OVERLOAD_TIME, QUEUED_PROVISIONING_TIME=b.QUEUED_PROVISIONING_TIME, QUEUED_REPAIR_TIME=b.QUEUED_REPAIR_TIME, RELEASE_VERSION=b.RELEASE_VERSION, ROLE_NAME=b.ROLE_NAME, ROWS_PRODUCED=b.ROWS_PRODUCED, SCHEMA_NAME=b.SCHEMA_NAME, SESSION_ID=b.SESSION_ID, START_TIME=b.START_TIME, TOTAL_ELAPSED_TIME=b.TOTAL_ELAPSED_TIME, TRANSACTION_BLOCKED_TIME=b.TRANSACTION_BLOCKED_TIME, USER_NAME=b.USER_NAME, WAREHOUSE_NAME=b.WAREHOUSE_NAME, WAREHOUSE_TYPE=b.WAREHOUSE_TYPE
when not matched
then insert (BYTES_SCANNED, COMPILATION_TIME, CREDITS_USED_CLOUD_SERVICES, DATABASE_NAME, END_TIME, EXECUTION_STATUS, EXECUTION_TIME, EXTERNAL_FUNCTION_TOTAL_INVOCATIONS, EXTERNAL_FUNCTION_TOTAL_RECEIVED_BYTES, EXTERNAL_FUNCTION_TOTAL_RECEIVED_ROWS, EXTERNAL_FUNCTION_TOTAL_SENT_BYTES, EXTERNAL_FUNCTION_TOTAL_SENT_ROWS, INBOUND_DATA_TRANSFER_BYTES, IS_CLIENT_GENERATED_STATEMENT, LIST_EXTERNAL_FILE_TIME, OUTBOUND_DATA_TRANSFER_BYTES, QUERY_ID, QUERY_TAG, QUERY_TEXT, QUERY_TYPE, QUEUED_OVERLOAD_TIME, QUEUED_PROVISIONING_TIME, QUEUED_REPAIR_TIME, RELEASE_VERSION, ROLE_NAME, ROWS_PRODUCED, SCHEMA_NAME, SESSION_ID, START_TIME, TOTAL_ELAPSED_TIME, TRANSACTION_BLOCKED_TIME, USER_NAME, WAREHOUSE_NAME, WAREHOUSE_TYPE) values (BYTES_SCANNED, COMPILATION_TIME, CREDITS_USED_CLOUD_SERVICES, DATABASE_NAME, END_TIME, EXECUTION_STATUS, EXECUTION_TIME, EXTERNAL_FUNCTION_TOTAL_INVOCATIONS, EXTERNAL_FUNCTION_TOTAL_RECEIVED_BYTES, EXTERNAL_FUNCTION_TOTAL_RECEIVED_ROWS, EXTERNAL_FUNCTION_TOTAL_SENT_BYTES, EXTERNAL_FUNCTION_TOTAL_SENT_ROWS, INBOUND_DATA_TRANSFER_BYTES, IS_CLIENT_GENERATED_STATEMENT, LIST_EXTERNAL_FILE_TIME, OUTBOUND_DATA_TRANSFER_BYTES, QUERY_ID, QUERY_TAG, QUERY_TEXT, QUERY_TYPE, QUEUED_OVERLOAD_TIME, QUEUED_PROVISIONING_TIME, QUEUED_REPAIR_TIME, RELEASE_VERSION, ROLE_NAME, ROWS_PRODUCED, SCHEMA_NAME, SESSION_ID, START_TIME, TOTAL_ELAPSED_TIME, TRANSACTION_BLOCKED_TIME, USER_NAME, WAREHOUSE_NAME, WAREHOUSE_TYPE);
In this way the table track_queries
enables change tracking - as long as the task periodically brings in the latest queries from the view.
Check the options to get more than 100 rows from query_history
:
Upvotes: 1
Reputation: 10039
It's not possible. Please take a look at the limitations on Streams on Views:
https://docs.snowflake.com/en/user-guide/streams-intro.html#streams-on-views
Streams are limited to views that satisfy the following requirements:
Underlying Tables All of the underlying tables must be native tables.
The view may only apply the following operations:
Projections
Filters
Inner or cross joins
UNION ALL
Upvotes: 1