假設你使用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
提取的數據不再是最新的,應該可能會刷新。
謝謝,這似乎是朝着正確的方向前進。但我不知道如何「使用它」我的嘗試是這樣的:http://www.ampaste.net/f3bac866d(我在測試時存儲在'真實'表中) – EKS 2010-10-20 12:40:32
@EKS - 我建議你編輯問題以包含您添加到pastebin中的代碼段和您的問題 - 它將有助於未來的用戶 – 2010-10-20 12:43:20