查询失败时如何将 query_id 和 query_text 插入日志 table

How to insert the query_id and query_text to the log table when query get failed

您好,我在 snowflake 中创建了一个存储过程,并希望在查询失败时将错误记录到日志中 table。在 table 中想要记录错误消息,query_id 和 query_text.here 是我尝试过的代码:

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`

$$

;

不能建议我最好的方法,任何指导或建议都是有帮助的。

如何快速了解一下出色的 Snowflake 工程师已经构建的内容?

  • 首先,Compute->Query History 下有一个漂亮的 GUI - 这会让您了解可用的内容。

  • 其次,有一个名为 QUERY_HISTORY 的 table 拥有大量信息。

    我敢打赌,您几乎可以从这里得到想要的一切...除了 result_set。

    然而,您可以查找 sed 存储过程的 'calling',然后在相同的会话 ID 下查找插入到 QUERY_HISTORY 中的后续行,也许检测到哪一个失败了?

     SELECT 
      TOP 10 *
     FROM 
          SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
     WHERE 
         EXECUTION_STATUS != 'SUCCESS';
    

如果确实需要构建自定义审计,则可以使用 getSqlText() and 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;