【问题标题】:Snowflake Javascript Procedure Truncate Table not effectiveSnowflake Javascript 程序截断表无效
【发布时间】:2020-07-31 03:59:59
【问题描述】:

本周我花了大部分时间在 Snowflake 中编写一些 Javascript 存储过程来处理一些事情。但我终其一生都无法弄清楚为什么 Truncate Table 不起作用。

    try {

        var get_tables = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'SCHEMA' AND TABLE_CATALOG = 'DATABASE' ORDER BY TABLE_NAME DESC;"
        var tableStmt = snowflake.createStatement( {sqlText: get_tables} );
        var rs = tableStmt.execute();

        while (rs.next()) {

            var table = rs.getColumnValue(1);

            var truncateTable = "TRUNCATE TABLE DATABASE.SCHEMA." + table
            var truncateStmt = snowflake.createStatment( {sqlText: truncateTable} );
            var truncateEx = truncateStmt.execute();
      }
   }

这种创建查询的模式在他们的文档中,并且似乎适用于我汇总的所有其他查询。但是这个失败了,我没有收到语法错误或任何东西。我省略了捕获和其他内容,因为这是唯一相关的部分。

我也试过了

var truncateTable = "TRUNCATE TABLE DATABASE.SCHEMA." + table + ";"

我已针对 Snowflake 中的普通 SQL 查询中的表测试了此特定查询,并确认它有效。

我错过了什么吗?

【问题讨论】:

    标签: javascript user-defined-functions snowflake-cloud-data-platform


    【解决方案1】:

    由于 SQL 在 try 块内执行,因此不会显示错误。也许你正在处理它,但它没有显示出来。

    如果你注释掉 try 块,它应该在运行时显示错误。可能是权限问题。存储过程可以使用调用者权限或所有者权限运行。如果调用者没有权限从 INFORMATION_SCHEMA 读取或截断列表中的表,则会出错。如果在这种情况下有意义,您可以调用使用所有者的权利。

    这样运行会发生什么?

        //try {
    
            var get_tables = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'SCHEMA' AND TABLE_CATALOG = 'DATABASE' ORDER BY TABLE_NAME DESC;"
            var tableStmt = snowflake.createStatement( {sqlText: get_tables} );
            var rs = tableStmt.execute();
    
            while (rs.next()) {
    
                var table = rs.getColumnValue(1);
    
                var truncateTable = "TRUNCATE TABLE DATABASE.SCHEMA." + table
                var truncateStmt = snowflake.createStatment( {sqlText: truncateTable} );
                var truncateEx = truncateStmt.execute();
          }
       //}
    

    【讨论】:

    • 我不得不不同意查询肯定会返回雪花表的列表。 SCHEMA 和 DATABASE 只是占位符值,我以前不使用我的数据库和模式的真实名称。
    • 好的。我以为您将它们作为变量传递。我会编辑。
    • 您在 Snowflake Web UI 的“查询历史记录”选项卡中看到此查询执行的哪些内容?
    【解决方案2】:

    这将起作用:

     create or replace procedure util_db.public.truncate_table("table_name" varchar,"truncate" boolean)
    returns string
    language javascript
    strict
    execute as owner
    as
    $$
    var sql_command = "Truncate table " + table_name ;
    try {
        if (truncate){
            snowflake.execute (
                {sqlText: sql_command}
                );
            return "Succeeded.";   // Return a success/error indicator.
            }
        }
    catch (err)  {
        throw(err);
       // return "Failed: " + err;   // Return a success/error indicator.
        }
    $$
    ;
    

    【讨论】:

    • 欢迎来到 S.O.如果您添加一些关于为什么它会起作用的信息,这个答案会更好。
    • 嗨,杰克,我测试并验证了它的工作原理。看到他们只有一个 sn-p 代码,我不确定缺少什么。例如:“以所有者身份执行”如果他们没有,他们可能没有权限执行截断表。详细信息在这里:docs.snowflake.com/en/sql-reference/sql/create-procedure.html.
    猜你喜欢
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 2018-06-05
    • 2013-04-02
    • 2011-09-13
    • 2022-01-23
    相关资源
    最近更新 更多