2016-10-27 7 views
0

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

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, а не идентификатор, который был назначен, когда был создан вид?

+0

Не могли бы вы поделиться определение представления, что вы хотите создать – NzGuy

+0

я уменьшил взгляд немного, но вот это: – BrianB

+0

CREATE OR REPLACE VIEW ADMIN.VW_PI_HRCHY_EPH КАК С SECURITY_GRP_CNT (COUNT) AS (SELECT COUNT (*) ОТ _V_USERGROUPS где имя_пользователя В (ВЫБРАТЬ SESSION_USERNAME ОТ _V_SESSION_DETAIL ГДЕ SESSION_ID = current_sid) И GROUPNAME = 'GROUP_AUTH2READ'), 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), – BrianB

ответ

0

Похоже, что функции Metateata Netezza (например, current_sid) не поддерживаются в статье 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") 
     ); 
+0

Это решение отлично работает! Благодарю. – BrianB

+0

@BrianB Если это решение является полезным запросом, пожалуйста, отметьте его как ответ. – NzGuy

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^