有没有办法在视图的SQL,current_sid中从Netezza返回当前登录的ID

时间:2016-10-27 20:09:40

标签: sql netezza

我在Netezza上有一条SQL语句,它使用以下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的视图,而不是创建视图时分配的ID?

2 个答案:

答案 0 :(得分:0)

似乎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")
        );

答案 1 :(得分:0)

NzGuy提供的解决方案解决了我的问题。正如他所说的那样,显然将current_sid联系人放在SQL的WITH子句中会导致常量的计算方式不同于它放在WITH之外的常量。在WITH子句之外定义的公用表表达式解决了我的问题。