Инструкция использования хранимой процедуры Snowflake

#snowflake-cloud-data-platform

#snowflake-cloud-data-platform

Вопрос:

Я работаю с хранимой процедурой Snowflake, которая будет принимать представление, измененное из одной базы данных в другую. Я пытаюсь

   var sqlCommand = `
    SELECT a.OBJECT_NAME, a.OBJECT_SCHEMA, a.OBJECT_TYPE, d.VIEW_DEFINITION
    FROM VIEW_OBJECT_LIST a
      INNER JOIN DB_DEV.INFORMATION_SCHEMA.VIEWS d ON a.OBJECT_NAME = d.TABLE_NAME AND a.OBJECT_SCHEMA = d.TABLE_SCHEMA
      INNER JOIN DB_QA.INFORMATION_SCHEMA.VIEWS q ON a.OBJECT_NAME = q.TABLE_NAME AND a.OBJECT_SCHEMA = q.TABLE_SCHEMA AND d.VIEW_DEFINITION != q.VIEW_DEFINITION;`;
      
  var viewList = snowflake.createStatement({ sqlText: sqlCommand}).execute();
  
  while(viewList.next()){
    var sql = viewList.VIEW_DEFINITION;
    var sql = 'USE DB_QA; ' || sql;
    snowflake.createStatement({ sqlText: sql }).execute();
  }
  

но получение сообщения об ошибке

 Unsupported statement type 'USE'. At Statement.execute
  

Есть ли способ в хранимой процедуре Snowflake иметь возможность запускать инструкцию USE как часть вызова API Snowflake?

Ответ №1:

какое разрешение на выполнение вы используете при создании этой хранимой процедуры? Если вы используете «ВЫПОЛНИТЬ ОТ ИМЕНИ ВЛАДЕЛЬЦА» в инструкции create procedure, возможно, вы не сможете использовать инструкции, отличные от приведенных ниже инструкций:->

 Restrictions on SQL Statements
Although caller’s rights stored procedures can execute any SQL statement that the caller has sufficient privileges to execute outside a stored procedure, owner’s rights stored procedures can call only a subset of SQL statements.

The following SQL statements can be called from inside an owner’s rights stored procedure:

SELECT.

DML.

DDL. (See above for restrictions on the ALTER USER statement.)

GRANT/REVOKE.

Variable assignment.

DESCRIBE and SHOW. (See limitations documented above.)

Other SQL statements cannot be called from inside an owner’s rights stored procedure.
  

Пожалуйста, попробуйте создать ту же процедуру, используя «ВЫПОЛНИТЬ ОТ ИМЕНИ ВЫЗЫВАЮЩЕГО АБОНЕНТА», это позволяет использовать собственные SQL-команды snowflake, такие как LIST, USE DATABASE, RM и т. Д.

Ответ №2:

Я считаю, что единственная проблема заключается в том, что вы не определили, что DB_QA находится в вашем USE заявлении. Я предполагаю, что это имя базы данных, поэтому вам просто нужно изменить эту строку, чтобы она была:

 var sql = 'USE DATABASE DB_QA; ' || sql
  

Однако я не уверен snowflake.createStatement , позволяет ли передавать запрос с несколькими операторами. Вам нужно будет сообщить мне, если это сработает.