查询失败时如何将 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;
您好,我在 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;