2013-01-17 76 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"