2013-01-17 78 views
0

我有一个数据库(在DB2 9.7上)假设我有表X,Y,Z ...... 现在我创建了相同的表X,Y,Z。 ..n在数据库B中我想为数据库B中的用户提供与数据库A中相同的GRANT。因此,基于SYSCAT.TABAUTH,我试图生成GRANT SQL。我已经为它写了以下查询:从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'" 

但是,我面临的问题是额外的','在结束。 假设用户只插入权威性,上面的查询会产生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 

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

回答

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上工作。

+0

Bhamby您好,感谢您的回答,但我做了一些修改您的查询,它的工作对我罚款,然后。请在我的答案中找到更新的查询。 –

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"