改变所有成员的角色

jjj*_*jjj 7 t-sql sql-server sql-server-2012

我使用的是SQL Server 2012,我的主要目标是以编程方式DROP ROLE,但除非角色为空,否则无法完成,那么我如何使用T-SQL首先删除角色的所有成员?

  • 我可以找到角色的所有成员:

    SELECT members.[name] 
    FROM sys.database_role_members AS rolemembers
        JOIN sys.database_principals AS roles 
            ON roles.[principal_id] = rolemembers.[role_principal_id]
        JOIN sys.database_principals AS members 
            ON members.[principal_id] = rolemembers.[member_principal_id]
    WHERE roles.[name]=@rolename
    
    Run Code Online (Sandbox Code Playgroud)
  • 会员可以使用以下方式删除

    ALTER ROLE role_name DROP MEMBER user_name
    
    Run Code Online (Sandbox Code Playgroud)

我怎样才能将这两者结合起来?或者还有另一种方法可以做我想做的事情吗?

(另外,我不确定这是否重要,但我将在Entity Framework 6迁移中使用它)

RBa*_*ung 7

以下是我将两者结合起来的方法:

DECLARE @rolename sysname = 'role_name';
DECLARE @cmd AS NVARCHAR(MAX) = N'';

SELECT @cmd = @cmd + '
    ALTER ROLE ' + QUOTENAME(@rolename) + ' DROP MEMBER ' + QUOTENAME(members.[name]) + ';'
FROM sys.database_role_members AS rolemembers
    JOIN sys.database_principals AS roles 
        ON roles.[principal_id] = rolemembers.[role_principal_id]
    JOIN sys.database_principals AS members 
        ON members.[principal_id] = rolemembers.[member_principal_id]
WHERE roles.[name]=@rolename

EXEC(@cmd);
Run Code Online (Sandbox Code Playgroud)

ALTER ROLE将为您的查询中的每一行(用户)创建一个带有命令的字符串,将它们连接成一个包含所有这些命令的大字符串,然后动态执行它们.