【问题标题】:ALTER ROLE to drop all membersALTER ROLE 删除所有成员
【发布时间】:2015-04-30 19:47:55
【问题描述】:

我正在使用 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
    
  • 可以使用以下方式删除成员:

    ALTER ROLE role_name DROP MEMBER user_name
    

如何将这两者结合起来?还是有其他方法可以做我想做的事情?

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

【问题讨论】:

    标签: sql-server tsql sql-server-2012


    【解决方案1】:

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

    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);
    

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

    【讨论】:

      【解决方案2】:

      sql server 中有特殊的sp (sp_droprolemember)。希望能解决你的问题。

      【讨论】:

      猜你喜欢
      • 2015-08-27
      • 2021-11-03
      • 2015-11-21
      • 1970-01-01
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多