Есть ли способ вернуть текущий идентификатор входа в систему из Netezza в SQL представления, current_sid

У меня есть оператор SQL на Netezza, который использует следующий SQL для получения текущего входа в систему user ID:

SELECT SESSION_USERNAME FROM _V_SESSION_DETAIL WHERE SESSION_ID=current_sid

Это прекрасно работает, когда я выполняю SQL в клиенте базы данных. Однако, когда я реализую приведенный выше SQL в представлении (наряду с другим SQL), current_sid заменяется на session ID, которое у меня было при создании представления. Тогда этот SQL будет выглядеть примерно так:

SELECT DEFINITION_SCHEMA."_V_SESSION_DETAIL".SESSION_USERNAME FROM DEFINITION_SCHEMA."_V_SESSION_DETAIL" WHERE (DEFINITION_SCHEMA."_V_SESSION_DETAIL".SESSION_ID = 2434740

Есть ли способ определить представление, которое будет получать текущий вход в систему user's ID, а не идентификатор, который был назначен при создании представления?


person BrianB    schedule 27.10.2016    source источник
comment
Не могли бы вы поделиться определением представления, которое вы хотите создать   -  person NzGuy    schedule 28.10.2016
comment
Я немного уменьшил вид, но вот он:   -  person BrianB    schedule 28.10.2016
comment
СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ПРОСМОТР ADMIN.VW_PI_HRCHY_EPH КАК С SECURITY_GRP_CNT (COUNT) КАК (ВЫБЕРИТЕ COUNT(*) FROM _V_USERGROUPS WHERE USERNAME IN (SELECT SESSION_USERNAME FROM _V_SESSION_DETAIL WHERE SESSION_ID=current_sid) AND GROUPNAME='GROUP_AUTH2READ (SELECTCHAR_MASK'), CHAR_MASK 'xxx' FROM _V_SESSION_DETAIL LIMIT 1), NUM_MASK (NUM_MASK_NUM) AS (SELECT -1 FROM _V_SESSION_DETAIL LIMIT 1),   -  person BrianB    schedule 28.10.2016
comment
TS_MASK (TS_MASK_TS) AS (SELECT '1000-01-01 00:00:00' FROM _V_SESSION_DETAIL LIMIT 1) SELECT CASE WHEN SECURITY_GRP_CNT.COUNT › 0 THEN PI_HRCHY.HRCHY_LINE_ID ELSE NUM_MASK.NUM_MASK_NUM END AS HRCHY_LINE_ID, CASE 0 THEN PI_HRCHY.LOCALE_CD ELSE CHAR_MASK.CHAR_MASK_CHAR END AS LOCALE_CD, CASE WHEN SECURITY_GRP_CNT.COUNT › 0 THEN PI_HRCHY.MODIFY_TS ELSE TS_MASK.TS_MASK_TS END AS MODIFY_TS   -  person BrianB    schedule 28.10.2016
comment
ОТ SECURITY_GRP_CNT, ADMIN.PI_HRCHY, CHAR_MASK, NUM_MASK, TS_MASK, ГДЕ ((PI_HRCHY.HRCHY_TYP_ID = 11) И (PI_HRCHY.ACTV_IND = 'Y'::NCHAR));   -  person BrianB    schedule 28.10.2016


Ответы (2)


Похоже, что функции метаданных Netezza (например, current_sid) не поддерживаются в предложении with, и рекомендуется удалить их из with и включить в базовый запрос.

CREATE
    OR REPLACE VIEW ADMIN.VW_PI_HRCHY_EPH AS
    WITH CHAR_MASK(CHAR_MASK_CHAR) AS (
            SELECT 'xxx'
            FROM _V_SESSION_DETAIL LIMIT 1
            )
        ,NUM_MASK(NUM_MASK_NUM) AS (
            SELECT - 1
            FROM _V_SESSION_DETAIL LIMIT 1
            )
        ,TS_MASK(TS_MASK_TS) AS (
            SELECT '1000-01-01 00:00:00'
            FROM _V_SESSION_DETAIL LIMIT 1
            )

SELECT CASE 
        WHEN SECURITY_GRP_CNT.COUNT > 0
            THEN PI_HRCHY.HRCHY_LINE_ID
        ELSE NUM_MASK.NUM_MASK_NUM
        END AS HRCHY_LINE_ID
    ,CASE 
        WHEN SECURITY_GRP_CNT.COUNT > 0
            THEN PI_HRCHY.LOCALE_CD
        ELSE CHAR_MASK.CHAR_MASK_CHAR
        END AS LOCALE_CD
    ,CASE 
        WHEN SECURITY_GRP_CNT.COUNT > 0
            THEN PI_HRCHY.MODIFY_TS
        ELSE TS_MASK.TS_MASK_TS
        END AS MODIFY_TS
FROM (
    SELECT COUNT(*) AS count
    FROM _V_USERGROUPS
    WHERE USERNAME IN (
            SELECT SESSION_USERNAME
            FROM _V_SESSION_DETAIL
            WHERE SESSION_ID = current_sid
            )
        AND GROUPNAME = 'GROUP_AUTH2READ'
    ) SECURITY_GRP_CNT
    ,ADMIN.PI_HRCHY
    ,CHAR_MASK
    ,NUM_MASK
    ,TS_MASK
WHERE (
        (PI_HRCHY.HRCHY_TYP_ID = 11)
        AND (PI_HRCHY.ACTV_IND = 'Y'::"NCHAR")
        );
person NzGuy    schedule 28.10.2016
comment
@BrianB Если это решение полезно, попросите вас отметить его как ответ. - person NzGuy; 28.10.2016

Решение, предоставленное NzGuy, решило мою проблему. Как он заявил, видимое размещение контакта current_sid в предложении WITH SQL приводит к тому, что константа оценивается иначе, чем если бы она была помещена вне предложения WITH. Выражение общей таблицы, определенное вне предложения WITH, решило мою проблему.

person BrianB    schedule 31.10.2016