我在sql数据库上有很多安全帐户,我希望根据简单的字符串比较删除/添加角色。
我现在发现的是,我使用sp_helprolemember列出了所有帐户以及sp_addrolemember和sp_droprolemember。我的问题是我不知道如何“获取”sp_helprolemember的输出并使用它。
我第一次根据反馈意见解决问题。
DROP TABLE [dbo].[XTemp] create table XTemp(DbRole sysname,MemberName sysname,MemberSID varbinary(85) ) insert XTemp exec sp_helprolemember select * from XTemp
我制作了一个永久表,以便更简单地进行测试和调试。
SELECT [DbRole] ,[MemberName] ,[MemberSID] FROM [ARTICLE].[dbo].[XTemp] WHERE MemberName like Domain\%' exec sp_addrolemember 'OldRole MemberName
答案 0 :(得分:2)
假设您正在使用SQL 2005或更高版本,并且在没有参数的情况下执行sp_helprolemember
,这是sp_helprolemember
运行的查询(使用sp_helptext
提取):
select DbRole = g.name, MemberName = u.name, MemberSID = u.sid
from sys.database_principals u, sys.database_principals g, sys.database_role_members m
where g.principal_id = m.role_principal_id
and u.principal_id = m.member_principal_id
order by 1, 2
这使您可以将所需信息收集到临时表中。
如果您更倾向于记录行为,可以将SP的输出存储到临时表中:
create table #t
(DbRole sysname,
MemberName sysname,
MemberSID varbinary(85)
)
insert #t
exec sp_helprolemember
select * from #t
修改强>
有两种方法可以使用此数据来修改您的系统。一个是使用光标:
DECLARE @memberName sysname
DECLARE curMember CURSOR fast_forward FOR
SELECT MemberName
FROM #t
WHERE MemberName LIKE 'Domain\%'
OPEN curMember
FETCH NEXT FROM curMember INTO @memberName
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC sp_addrolemember 'OldRole', @memberName
FETCH NEXT FROM curMember INTO @memberName
END
CLOSE curMember
DEALLOCATE curMember
另一个是使用动态SQL:
DECLARE @sql NVARCHAR(MAX),
SELECT @sql = 'EXEC sp_addrolemember ''OldRole'', ''' + MemberName + ''''
FROM #t
WHERE MemberName LIKE 'Domain\%'
EXEC sp_executesql @stmt = @sql
正如您所看到的,动态SQL版本更紧凑,但需要更多维护。
请记住,在执行任一语句后,您从sp_helprolemember
提取到表中的数据不再是最新的,并且可能应该刷新。
答案 1 :(得分:0)
您可以使用Excel生成SQL查询 - 我知道它听起来很蹩脚,但它非常简单和强大。它特别适用于必须一次或仅不时执行的任务。
="EXEC sp_dropsrvrolemember '"&A1&"', 'sysadmin'"
)生成对列A中存储的值的查询(公式当然可以引用带有输入数据的多个列并生成非常复杂的查询)。