查询失败时如何将 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 中?

查询失败(使用 mssql_query() 和 php 时)

MySQL常用优化方案

用学说 2 设置 LIMIT?

在php中如何对多条记录进行分页