2010-08-26 70 views

回答

2

我會建議你創建一個新的組,讓所有用戶帳戶屬於它。然後在所有數據庫中爲該角色授予db_datareader權限。

要創建一個名爲「人人」的新服務器角色:​​

...然後把所有的用戶帳戶進去(你可以找到T-SQL從this article做到這一點,但你必須要把它挖出來 - 我的防火牆不會讓我在這裏發佈這個片段!)。

...然後讓角色的每一個數據庫的db_datareader角色的成員:

EXEC sp_msforeachdb 'USE [?] EXEC sp_addrolemember [db_datareader], [EVERYONE]'; 

注意,出於安全考慮,您可能不希望在系統數據庫像「高手」全db_datareader權限,所以你可以可以從這些刪除Everyone組

現在,你只需要記住:

  1. 當你創建一個新用戶登錄時,將其添加到「每個人」的角色:EXEC sp_addrolemember [EVERYONE], [new_user_name]
  2. 當您創建一個新的數據庫,添加「EVERYONE」到「擁有db_datareader」的角色:USE [new_db_name]; EXEC sp_addrolemember [db_datareader], [EVERYONE]
+0

sp_addrole創建數據庫角色,而不是服務器角色。目前無法在任何版本的MSSQL中創建服務器角色。 – Pondlife 2010-08-26 15:57:12

+0

啊,好點,@Pondlife!這將是一個管理噩夢,在每個數據庫中創建本地角色並與所有用戶一起填充。我想如果你使用的是Windows身份驗證,你可以使用包含所有擁有SQL Server權限的用戶的域組登錄名,然後將datareader角色賦予每個數據庫中的登錄名。因此,每當該組中的用戶沒有用戶特定的登錄權限時,就會回退到給定的數據庫角色。 – ewall 2010-08-26 18:08:25

1

對於新數據庫,能不只需將用戶/組添加到模型數據庫中的只讀角色即可。創建新數據庫時,將用作模板。

1

最簡單的解決方案是將您的用戶添加到模型數據庫。所有新的數據庫從model「繼承」,因此,如果您添加的用戶那裏,它會自動在所有新的:

use model 
exec sp_adduser @Loginame = 'MyLogin', @name_in_db = 'MyUser' 
exec sp_addrolemember @rolename = 'db_datareader', @membername = 'MyUser' 

請注意,這僅適用,如果你實際執行CREATE DATABASE。如果通過恢復備份(或者CREATE然後RESTORE)來創建新的數據庫,那麼備份的內容將覆蓋來自模型的任何內容。

如果您的需求更爲複雜,請編寫您自己的腳本或工具來創建新的數據庫,並將邏輯放在那裏。無論如何,如果您必須管理大量數據庫,您可能會這樣做。