2010-10-20 83 views
1

我在sql數據庫上有很多安全帳戶,我想根據簡單的字符串比較來刪除/添加角色。更改多個安全帳戶的角色

  1. 基本上我想列出所有 佔
  2. 過濾掉不以 「MYDOMAIN \」
  3. 刪除角色A.
  4. 添加角色B.
開始 賬戶

我現在發現的是,我用sp_helprolemember來列出所有的賬戶,sp_addrolemembersp_droprolemember。我的問題是,我不知道如何從sp_helprolemember「獲得」輸出並使用它。

我第一次嘗試基於反饋的soltuion。

 
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 

回答

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提取的數據不再是最新的,應該可能會刷新。

+0

謝謝,這似乎是朝着正確的方向前進。但我不知道如何「使用它」我的嘗試是這樣的:http://www.ampaste.net/f3bac866d(我在測試時存儲在'真實'表中) – EKS 2010-10-20 12:40:32

+1

@EKS - 我建議你編輯問題以包含您添加到pastebin中的代碼段和您的問題 - 它將有助於未來的用戶 – 2010-10-20 12:43:20

0

您可以使用Excel來生成SQL查詢 - 我知道這聽起來很蹩腳,但它非常簡單和強大。它特別適合需要不時執行一次或僅執行一次的任務。

  1. 將結果從Management Studio複製到Excel。
  2. 移除比您不需要的行和列。
  3. 使用列B中的公式(例如,="EXEC sp_dropsrvrolemember '"&A1&"', 'sysadmin'")生成對列A中存儲的值的查詢(該公式當然可以引用具有輸入數據的多個列並生成非常複雜的查詢)。
  4. 將生成的查詢從Excel複製到Management Studio。