【问题标题】:How to insert the query_id and query_text to the log table when query get failed查询失败时如何将 query_id 和 query_text 插入日志表
【发布时间】:2023-03-29 21:08:02
【问题描述】:

您好,我在雪花中创建了一个存储过程,并希望在查询失败时将错误记录到日志表中。在表中要记录错误消息,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`

$$

;

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

【问题讨论】:

    标签: stored-procedures snowflake-cloud-data-platform


    【解决方案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';
        

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-21
        • 2014-11-01
        • 2012-09-07
        • 2012-01-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多