从syscat.tabauth表动态生成GRANT SQL

时间:2013-01-17 17:45:59

标签: sql db2 db2-400 db2-luw

我有一个数据库(在DB2 9.7上)A,假设我有表X,Y,Z ... n 现在我在数据库B中创建了相同的表X,Y,Z ... n。我想为数据库B中的用户提供与数据库A中相同的GRANT。所以基于SYSCAT.TABAUTH我试图生成GRANT SQL 。我已经为它编写了以下查询:

db2 "select 'GRANT '||
case INSERTAUTH
    WHEN 'Y' THEN 'INSERT,'
    WHEN 'N' THEN ' '
    END||
case ALTERAUTH
    WHEN 'Y' THEN 'ALTER,'
    WHEN 'N' THEN ' '
    END||
case DELETEAUTH
    WHEN 'Y' THEN 'DELETE,'
    WHEN 'N' THEN ' '
    END||
case SELECTAUTH
    WHEN 'Y' THEN 'SELECT,'
    WHEN 'N' THEN ' '
    END||
case UPDATEAUTH
    WHEN 'Y' THEN 'UPDATE,'
    WHEN 'N' THEN ' '
    END||
' ON '||TABSCHEMA||'.'||TABNAME||' TO '||GRANTEE from SYSCAT.TABAUTH 
where INSERTAUTH='Y' OR  ALTERAUTH='Y' OR DELETEAUTH='Y' OR SELECTAUTH='Y' OR UPDATEAUTH='Y'"

然而,我面临的问题是最后的额外','。 假设用户只有Insert auth,上面的查询将生成GRANT sql为:

GRANT INSERT, ON SCHEMA.TABLE TO GRANTEENAME
or if user has insert and select grants then:
GRANT INSERT,SELECT, ON SCHEMA.TABLE TO GRANTEENAME

我该如何解决这个问题?请帮忙..

2 个答案:

答案 0 :(得分:0)

您始终可以将动态部分推送到子查询中,然后使用LENGTH()SUBSTR()的组合来删除额外的逗号。这是我修改过的SQL:

SELECT
'GRANT' ||
SUBSTR(T.AUTHSTRING, 1 LENGTH(T.AUTHSTRING) -1) 
|| T.TABNAME
FROM(
select
    case INSERTAUTH
        WHEN 'Y' THEN 'INSERT,'
        WHEN 'N' THEN ' '
    END
    ||
    case ALTERAUTH
        WHEN 'Y' THEN 'ALTER,'
        WHEN 'N' THEN ' '
    END
    ||
    case DELETEAUTH
        WHEN 'Y' THEN 'DELETE,'
        WHEN 'N' THEN ' '
    END
    ||
    case SELECTAUTH
        WHEN 'Y' THEN 'SELECT,'
        WHEN 'N' THEN ' '
    END
    ||
    case UPDATEAUTH
        WHEN 'Y' THEN 'UPDATE,'
        WHEN 'N' THEN ' '
    END
    AS AUTHSTRING,

    ' ON ' || RTRIM(TABSCHEMA) || '.' || RTRIM(TABNAME)||' TO ' || RTRIM(GRANTEE) AS TABNAME
from SYSCAT.TABAUTH
where INSERTAUTH='Y'
   OR  ALTERAUTH='Y'
   OR DELETEAUTH='Y'
   OR SELECTAUTH='Y'
   OR UPDATEAUTH='Y'
) AS T

我对此进行了测试,它适用于LUW 9.7和z / OS 9.1。

答案 1 :(得分:0)

这是我最终制作的并且工作正常:

db2 "SELECT
'GRANT ' ||
SUBSTR(T.AUTHSTRING, 1 ,LENGTH(T.AUTHSTRING) - 1) 
|| T.TABNAME
FROM(
select
    case INSERTAUTH
        WHEN 'Y' THEN 'INSERT,'
        WHEN 'N' THEN ''
    END
    ||
    case ALTERAUTH
        WHEN 'Y' THEN 'ALTER,'
        WHEN 'N' THEN ''
    END
    ||
    case DELETEAUTH
        WHEN 'Y' THEN 'DELETE,'
        WHEN 'N' THEN ''
    END
    ||
    case SELECTAUTH
        WHEN 'Y' THEN 'SELECT,'
        WHEN 'N' THEN ''
    END
    ||
    case UPDATEAUTH
        WHEN 'Y' THEN 'UPDATE,'
        WHEN 'N' THEN ''
    END
    AS AUTHSTRING,
    ' ON ' ||TRIM(TABSCHEMA)||'.'||TRIM(TABNAME)||' TO ' ||GRANTEE AS TABNAME
from SYSCAT.TABAUTH
where INSERTAUTH='Y'
   OR  ALTERAUTH='Y'
   OR DELETEAUTH='Y'
   OR SELECTAUTH='Y'
   OR UPDATEAUTH='Y'
) AS T"