SQL Server 2016动态列分组:组成员继承组权限输出需求
解决SQL Server动态列下成员继承组权限的查询问题
针对你描述的需求——仅展示组的成员,同时附带所属组名及继承的对应数据库权限,可通过动态SQL实现,因为数据库列是动态变化的,硬编码列名无法适配列的增减。
实现步骤及代码
- 动态获取数据库列名:从系统视图中提取所有数据库相关的列(排除
Sequence、user_name等非权限列)。 - 构造关联查询SQL:将成员表与组表关联,直接继承组对应的数据库权限值。
完整SQL代码如下:
DECLARE @DBColumns NVARCHAR(MAX) = ''; -- 动态获取所有数据库权限列 SELECT @DBColumns += QUOTENAME(c.name) + ' = g.' + QUOTENAME(c.name) + ', ' FROM sys.columns c JOIN sys.tables t ON c.object_id = t.object_id WHERE t.name = 'test' AND c.name NOT IN ('Sequence', 'user_name', 'LoginType', 'groupname', 'DBName'); -- 移除末尾多余的逗号 SET @DBColumns = LEFT(@DBColumns, LEN(@DBColumns) - 1); -- 构造并执行动态查询 DECLARE @DynamicSQL NVARCHAR(MAX) = N' SELECT m.user_name AS 成员账号, m.groupname AS 所属组名, ' + @DBColumns + ' FROM dbo.test m JOIN dbo.test g ON m.groupname = g.user_name WHERE m.LoginType = ''WINDOWS_GROUP- User'' AND g.LoginType = ''WINDOWS_GROUP'';'; EXEC sp_executesql @DynamicSQL;
代码说明
- 列名动态生成:通过
sys.columns和sys.tables自动获取数据库权限列,无需手动维护列名,自动适配列的新增/删除。 - 关联逻辑:成员表(
m,LoginType='WINDOWS_GROUP- User')通过groupname关联到对应的组表(g,LoginType='WINDOWS_GROUP'),直接继承组的权限值。 - 输出结果:仅展示成员账号、所属组名,以及该成员从组继承的所有数据库权限。
示例输出
针对你提供的测试数据,执行后会得到如下结果:
| 成员账号 | 所属组名 | master | tempdb | BI_SOPS | BI_PSO | BI_SUP | BI_FIN | BI_EDU |
|---|---|---|---|---|---|---|---|---|
| TR\u1 | VINX\SqlServer_FIN | NULL | NULL | NULL | NULL | NULL | db_datareader | NULL |
| TR\u2 | VINX\SqlServer_FIN | NULL | NULL | NULL | NULL | NULL | db_datareader | NULL |
内容的提问来源于stack exchange,提问作者Vikas J
相关产品推荐
相关产品推荐

