我有一个数据库(在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
我该如何解决这个问题?请帮忙..
答案 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"