0

データベース (DB2 9.7 上) A があり、テーブル X、Y、Z...n があるとします。データベース B に同じテーブル X、Y、Z...n を作成しました。同じ GRANT を提供したいデータベースAの場合と同様に、データベースBのユーザーに。したがって、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

どうすればこれを解決できますか? 助けてください..

4

2 に答える 2

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"
于 2013-01-18T07:34:46.543 に答える
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 で動作しました。

于 2013-01-17T22:02:28.773 に答える