You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server 2016动态列分组:组成员继承组权限输出需求

解决SQL Server动态列下成员继承组权限的查询问题

针对你描述的需求——仅展示组的成员,同时附带所属组名及继承的对应数据库权限,可通过动态SQL实现,因为数据库列是动态变化的,硬编码列名无法适配列的增减。

实现步骤及代码

  1. 动态获取数据库列名:从系统视图中提取所有数据库相关的列(排除Sequence、user_name等非权限列)。
  2. 构造关联查询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'),直接继承组的权限值。
  • 输出结果:仅展示成员账号、所属组名,以及该成员从组继承的所有数据库权限。

示例输出

针对你提供的测试数据,执行后会得到如下结果:

成员账号所属组名mastertempdbBI_SOPSBI_PSOBI_SUPBI_FINBI_EDU
TR\u1VINX\SqlServer_FINNULLNULLNULLNULLNULLdb_datareaderNULL
TR\u2VINX\SqlServer_FINNULLNULLNULLNULLNULLdb_datareaderNULL

内容的提问来源于stack exchange,提问作者Vikas J

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 15:12:39