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迁移中使用它)
以下是我将两者结合起来的方法:
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将为您的查询中的每一行(用户)创建一个带有命令的字符串,将它们连接成一个包含所有这些命令的大字符串,然后动态执行它们.
| 归档时间: |
|
| 查看次数: |
6661 次 |
| 最近记录: |