查询失败时如何将 query_id 和 query_text 插入日志表
Posted
技术标签:
【中文标题】查询失败时如何将 query_id 和 query_text 插入日志表【英文标题】:How to insert the query_id and query_text to the log table when query get failed 【发布时间】:2021-08-17 22:15:26 【问题描述】:您好,我在雪花中创建了一个存储过程,并希望在查询失败时将错误记录到日志表中。在表中要记录错误消息,query_id 和 query_text。这是我尝试过的代码:
create or replace procedure error_log_test()
returns varchar not null
language javascript
as
$$
try
var copy_into_cmd = `copy into my_table from @my_stage
file_format=(format_name= 'my_file_format')
on_error = skip_file;`;
var copy_into_stmt = snowflake.createStatement(sqlText: copy_into_cmd);
var result_set= copy_into_stmt.execute();
result_set.next();
catch(err)
var log_insert_into= snowflake.createStatement(sqlText:`insert into error_table
'err.code'
'err.message',
'$result_set.getColumnValue(7)',
'$load_stmt.getSqlText()';`);
log_insert_into.execute();
return err.message`enter code here`
$$
;
能否建议我最好的方法,任何指导或建议都会有所帮助。
【问题讨论】:
【参考方案1】:如果确实需要构建定制的审计,那么可以使用 getSqlText() 和 getQueryId 检索 queryId 和 queryText
示例:
create or replace table error_table(code TEXT,message TEXT,
queryid TEXT, querytext TEXT);
create or replace procedure error_log_test()
returns varchar not null
language JAVASCRIPT
as
$$
var sql_stmt;
try
var copy_into_cmd = `SELECT 1/0;`;
sql_stmt = snowflake.createStatement(sqlText: copy_into_cmd);
var result_set= sql_stmt.execute();
result_set.next();
catch(err)
var queryId = sql_stmt.getQueryId();
var queryText = sql_stmt.getSqlText()
var log_insert_into=snowflake.createStatement(sqlText:`insert into error_table
(code, message, queryid, querytext) VALUES (?,?,?,?);`
,binds : [err.code, err.message,queryId,queryText]
);
log_insert_into.execute();
return err.message;
return 'Success';
$$
;
运行:
CALL error_log_test();
SELECT * FROM error_table;
【讨论】:
【参考方案2】:如何快速了解一下出色的 Snowflake Engineers 已经构建的东西?
首先在 Compute->Query History 下有一个不错的 GUI - 这会让您了解可用的内容。其次,有一个名为QUERY_HISTORY 的表,其中包含大量信息。
愿意打赌你会从这里得到几乎所有你想要的东西......除了 result_set。
但是,您可以查找 sed 存储过程的“调用”,然后在同一会话 ID 下查找插入到 QUERY_HISTORY 中的后续行,可能会检测到哪一行失败?
SELECT
TOP 10 *
FROM
SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE
EXECUTION_STATUS != 'SUCCESS';
【讨论】:
以上是关于查询失败时如何将 query_id 和 query_text 插入日志表的主要内容,如果未能解决你的问题,请参考以下文章
query_id 在所有 Snowflake 帐户中是唯一的吗?
为啥很少有 query_id 没有出现在 query_history 中?