我尝试将XMLAGG实现为一个查询,用于在Teradata中查找用户AccessRights。这是查询:
SELECT
A.RoleName
, B.DatabaseName
--, B.AccessRight
, Trim(Trailing ',' FROM (XmlAgg(Trim(B.AccessRight) || ',' ORDER BY B.AccessRight) (VARCHAR(10000)))) AS AccessRight
FROM DBC.RoleMembers A JOIN DBC.AllRoleRights B
ON A.RoleName = B.RoleName
WHERE Grantee='?your_id'
GROUP BY 1,2
ORDER BY 2,1,3
;
以前我只会选择注释行B.AccessRight
并梳理结果,但我想将每个角色的AccessRights合并为一行。
上面的查询确实有效,但偶尔会有行重复。这是输出的快速示例:
+----------+--------------+-------------+
| RoleName | DatabaseName | AccessRight |
+----------+--------------+-------------+
| Role1 | dbA | CM, CT, CV |
+----------+--------------+-------------+
| Role2 | dbB | R, R, R, R | <-- Problematic column
+----------+--------------+-------------+
| Role3 | dbC | E, R |
+----------+--------------+-------------+
我已尝试通过将DISTINCT添加到我的XMLAGG查询来解决此问题,就像我在several其他solutions中看到的那样,但我似乎无法自己解决这个问题。
答案 0 :(得分:1)
DBC.AllRoleRightsV包括数据库,表或列级别的权限。因此,您可能会在数据库级别上获得重复项。
join ( select distinct databasename, accessright from DBC.AllRoleRightsV ) as B
可能会有所帮助。
或添加where tableName = 'All'
以仅获取数据库级授权。