Снежинка, задачи и переменные сессии - PullRequest
0 голосов
/ 01 ноября 2019

У меня проблема в Snowflake с задачей, которая выполняет хранимые процедуры, и SP использует переменную сеанса QUERY_TAG, которую я хочу использовать для ведения журнала. Когда Task выполняет SP, я получаю сообщение об ошибке: «Переменная сеанса '$ QUERY_TAG' не существует» EXECUTE AS CALLER есть. Не имеет значения, где я пытаюсь установить QUERY_TAG (в первом коде pre Task-кода)или в определении).

Задачи и SP создаются мной как SYSADMIN

Когда я выполняю SP в редакторе запросов (Snowflake, DBeaver и т. д.), он работает нормально, поэтомунет ошибок кодирования в SP. SET QUERY_TAG = 'Хороший тег запроса' CALL TASK_SCHEMA.SP_TASK_ONE ()

Это нормально работает, когда я звоню, делая это на рабочем листе или в DBeaver или аналогичном. Оба пути в SP работают (встроенный SQL или функция getQueryTag)

Вот код для задач и SP

CREATE OR REPLACE TASK TASK_SCHEMA.TASK_ONE_PRECOND
    WAREHOUSE = TASK_WH
    SCHEDULE = '2 minute'
    QUERY_TAG = 'My Query Tag'
AS
    SET QUERY_TAG = 'My Query Tag 2'


CREATE OR REPLACE TASK TASK_SCHEMA.TASK_ONE
    WAREHOUSE = TASK_WH
    AFTER TASK_SCHEMA.TASK_ONE_PRECOND
AS
    CALL TASK_SCHEMA.SP_TASK_ONE()


create or replace procedure TASK_SCHEMA.SP_TASK_ONE()
    RETURNS VARCHAR(50)
    LANGUAGE JAVASCRIPT
    EXECUTE AS CALLER
as $$    

function getQueryTag()
{
    var QueryTag;
    rs_QT = snowflake.execute ( { sqlText: `SELECT $QUERY_TAG;` }  );
    if( rs_QT.next())
    {
        QueryTag = rs_QT.getColumnValue(1); // get the QueryTag
    }

    return QueryTag; 
}   

    var qtag = getQueryTag();

    //rs = snowflake.execute ( { sqlText: 
    //`INSERT INTO "LOG"."TESTSESSIONLOG"
    //  ("SESSION_NAME")
    //SELECT $QUERY_TAG
    //` }  );


    snowflake.execute({
               sqlText: `INSERT INTO LOG.TESTSESSIONLOG 
               (SESSION_NAME) 
               VALUES (?)`
               ,binds: [ qtag]
    });   

    return "SESSION_OK"; 

  $$;

1 Ответ

0 голосов
/ 01 ноября 2019

Редактировать 4 ноября 2019 г .: Мой ответ ниже не совсем правильный, есть способ передать значения между задачей и ее преемником. См. Документ SYSTEM $ SET_RETURN_VALUE .

Даже если вы определяете зависимости между задачами, это не означает, что задача наследует что-либо от предшественника в дереве задач.

Поэтому, если вы установите переменную в одной задаче, эта переменная будет потеряна после ее завершения.

Это отличается от обычного сеанса (как в графическом интерфейсе), где состояние сеанса сохраняется между командами, которые вы выполняете внутрисеанс.

Между задачами, единственное, что связано, это время окончания предшественника и время начала преемника (ей).

Когда дело доходит до извлечения тега запроса, выЖелательно, чтобы спросить систему для этого:

function getQueryTag()
{
    var rs_QT = snowflake.execute ( { sqlText: `SHOW PARAMETERS LIKE 'QUERY_TAG'` }  );
    return rs_QT.next() && rs_QT.getColumnValue("value"); // get the QueryTag
} 
...