Snowflake cloud data platform Snowflake存储过程中每个DML操作的审核或行计数

Snowflake cloud data platform Snowflake存储过程中每个DML操作的审核或行计数,snowflake-cloud-data-platform,dml,rowcount,Snowflake Cloud Data Platform,Dml,Rowcount,我想在存储过程中捕获merge和insert语句的审计,并尝试通过会话从查询历史记录中获取查询ID来使用Result\u Scan。但是JavaScript过程中不允许使用这些语句。然后,我创建了一个函数,用于获取最近执行的SQL查询的查询ID create or replace function GET_QUERY_ID() RETURNS VARCHAR AS 'SELECT QUID FROM (SELECT (QUERY_ID)::VARCHAR AS QUID FROM T

我想在存储过程中捕获merge和insert语句的审计,并尝试通过会话从查询历史记录中获取查询ID来使用Result\u Scan。但是JavaScript过程中不允许使用这些语句。然后,我创建了一个函数,用于获取最近执行的SQL查询的查询ID

create or replace function GET_QUERY_ID()
   RETURNS VARCHAR
   AS 'SELECT QUID FROM (SELECT (QUERY_ID)::VARCHAR AS QUID FROM TABLE(INFORMATION_SCHEMA.QUERY_HISTORY_BY_SESSION(CURRENT_SESSION()::NUMBER)) WHERE QUERY_TYPE IN (''INSERT'',''MERGE'') ORDER BY END_TIME DESC ) LIMIT 1';
并尝试为行计数创建另一个函数

create or replace function GET_RESULT_SCAN(P_QUERY_ID VARCHAR)
   RETURNS TABLE ( INSERT_ROWS NUMBER ,UPDATED_ROWS NUMBER)
   AS 'select * from (select "number of rows updated"::NUMBER as INSERT_ROWS, "number of multi-joined rows updated"::NUMBER as UPDATED_ROWS from table(result_scan(P_QUERY_ID)))';
但这不起作用,我不能在用JavaScript创建的存储过程中调用这些函数。
请让我知道对存储过程中插入和更新的行数进行审计的最佳做法。假设存储过程中有5-10条SQL语句。

尝试在存储过程定义的顶部添加一行executeascaller :

创建[或替换]过程([[],…])
返回[非空]
语言JAVASCRIPT
[{对空输入调用|{对空输入返回空值| STRICT}]
[易变的|不变的]
[评论='']
[作为{调用方|所有者}执行]
“作为”

下面是一个简单的过程,用于合并、捕获并返回插入和更新的行数:

CREATE OR REPLACE PROCEDURE utl.arch_merge_sp(P_STAGE_TBL VARCHAR, P_FINAL_TBL VARCHAR)
  RETURNS STRING
  LANGUAGE JAVASCRIPT
  EXECUTE AS CALLER
AS $$
  var sqlCmd = "";
  var sqlStmt = "";
  var result = "";

  try {
    sqlCmd = `
      MERGE INTO final_t F USING stage_t S
      ON F.KEY_ID = S.KEY_ID
      WHEN MATCHED THEN UPDATE SET
       F.ATTR_NM = S.ATTR_NM
      ,F.ATTR_NBR = S.ATTR_NBR
      WHEN NOT MATCHED THEN INSERT (
       F.KEY_ID
      ,F.ATTR_NM
      ,F.ATTR_NBR
      ) VALUES (
       S.KEY_ID
      ,S.ATTR_NM
      ,S.ATTR_NBR);
      `;
    sqlStmt = snowflake.createStatement( {sqlText: sqlCmd} );
    rs = sqlStmt.execute();

    sqlCmd = 
      `SELECT "number of rows inserted", "number of rows updated"
        FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()))`;
    sqlStmt = snowflake.createStatement( {sqlText: sqlCmd} );
    rs = sqlStmt.execute();
    rs.next();

    result += "Rows inserted: " + rs.getColumnValue(1) + ", Rows updated: " + rs.getColumnValue(2)

  }
  catch (err) {
    result =  "Failed: Code: " + err.code + " | State: " + err.state;
    result += "\n  Message: " + err.message;
    result += "\nStack Trace:\n" + err.stackTraceTxt; 
    }

  return result;
$$;

我需要记录每个SQL的开始时间戳和结束时间戳以及记录计数。 然后尝试输入审计表和计数。时间戳格式更改为字符串。获取每个SQL的开始和结束时间戳的好方法是什么?请使用一些换行符。
CREATE OR REPLACE PROCEDURE utl.arch_merge_sp(P_STAGE_TBL VARCHAR, P_FINAL_TBL VARCHAR)
  RETURNS STRING
  LANGUAGE JAVASCRIPT
  EXECUTE AS CALLER
AS $$
  var sqlCmd = "";
  var sqlStmt = "";
  var result = "";

  try {
    sqlCmd = `
      MERGE INTO final_t F USING stage_t S
      ON F.KEY_ID = S.KEY_ID
      WHEN MATCHED THEN UPDATE SET
       F.ATTR_NM = S.ATTR_NM
      ,F.ATTR_NBR = S.ATTR_NBR
      WHEN NOT MATCHED THEN INSERT (
       F.KEY_ID
      ,F.ATTR_NM
      ,F.ATTR_NBR
      ) VALUES (
       S.KEY_ID
      ,S.ATTR_NM
      ,S.ATTR_NBR);
      `;
    sqlStmt = snowflake.createStatement( {sqlText: sqlCmd} );
    rs = sqlStmt.execute();

    sqlCmd = 
      `SELECT "number of rows inserted", "number of rows updated"
        FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()))`;
    sqlStmt = snowflake.createStatement( {sqlText: sqlCmd} );
    rs = sqlStmt.execute();
    rs.next();

    result += "Rows inserted: " + rs.getColumnValue(1) + ", Rows updated: " + rs.getColumnValue(2)

  }
  catch (err) {
    result =  "Failed: Code: " + err.code + " | State: " + err.state;
    result += "\n  Message: " + err.message;
    result += "\nStack Trace:\n" + err.stackTraceTxt; 
    }

  return result;
$$;