sql server 孤立使用者 是我們經常遇到的事情,今天詳細的梳理了下,希望能幫到你
當把使用者資料庫從一台 sql server 使用備份和恢復的方式遷移到另一台伺服器。資料庫恢復以後,原先使用者定義的一些其他資料庫使用者,就無法在新伺服器上繼續使用了。尤其對一些sql ser 帳號,這些就是孤立使用者。
sql server 的使用者安全管理分兩層,整個 sql server 伺服器一層,每個資料庫一層。乙個使用者,在每一層上都有帳號,在兩個層面上都會分配不同的權利。在伺服器層的帳號,交登入帳號(login),可以設定它管理整個 sql server 伺服器,開啟跟蹤,修改 sql server 安全配置,備份所有資料庫等。在資料庫一層,叫資料庫使用者(database user),可以設定它對這個特定的資料庫有讀寫、修改表結構、儲存過程定義等許可權。
伺服器層面的安全,是設定在伺服器的登陸賬號上的。所有登入帳號的資訊,可以查詢 master 資料庫裡面的 sys.server_principals 這張檢視。
資料庫層面有「資料庫使用者」這個概念。每個資料庫內部物件的安全性,例如**的讀寫,是否訥訥感執行或修改儲存過程等,都賦予在資料庫使用者上,儲存在這個資料庫內部。可以通過查詢 sys.database_principals 了解使用者資訊。
sql server 登入帳號必須要和某個資料庫使用者相對應後,才能被資料庫接納。這個對應,就是要使得使用者資料庫 sys.database_principals 裡面 sid 和 master 資料庫 sys.server_principals 裡的 sid 匹配起來。乙個登入賬戶和資料庫使用者的名字可以不一樣,但是 sid 必須一樣。
當使用者資料庫恢復到新的伺服器上後,master 資料庫 sys.server_principals 裡並沒有這個帳號。但是使用者資料庫裡還有 這個資料庫使用者。於是這個使用者被「孤立」了。
解決辦法:
1. 備份時,要把系統資料庫一併備份了,再恢復的時間,也把資料庫恢復了
2. 通過 sp_change_users_login 來更改使用者
如要檢測孤立使用者:
user<
database_name
>;go
;sp_change_users_login
@action='
report';
go;
恢復孤立使用者:
user<
database_name
>;go
;sp_change_users_login
@action='
update_one',
@usernamepattern='
',@loginname='
';go;
需要說明的是,sp_change_users_login 只能重新鏈結 sql 登入帳號。對於資料庫使用者所對應的是 windows 登入帳號,如果sid 不同,說明域也發生了變化,是不能通過這種方式連線在一起的。
更先進的方法
經過多次排除孤立使用者發現,一般孤立使用者都是好幾個同時出現的,而手工乙個個來排除效率太低,又容易出錯,所以寫了乙個比較智慧型的儲存過程,一次排除當前庫中的所有孤立使用者:
declare@username
nvarchar(50)
create
table #temp_user(
username nvarchar(50),
usersid int
) insert
into #temp_user exec sp_change_users_login @action='
report
'declare temp_cursor cursor
forselect username from #temp_user
open temp_cursor
fetch
next
from temp_cursor into
@username
while (@@fetch_status=0)
begin
exec sp_change_users_login '
auto_fix
', @username, null, @username;
exec sp_change_users_login @action='
update_one
',@usernamepattern
=@username,@loginname
=@username;
fetch next from temp_cursor into @username
endclose temp_cursor
deallocate temp_cursor
drop
table #temp_user
通過 "孤立使用者" 的處理可以看出來:
1. sql server 的安全分兩層,分別為:server 和 database
2. 備份和恢復資料庫是很重要的
本文出處:sql server 孤立使用者解決辦法
SQL SERVER 孤立使用者
sql server使用者管理分為兩層,例項級的login和資料庫級的使用者 login的sid和資料庫使用者的sid必須一樣才行 資料庫搬遷login在重建時生成新的sid,與原來資料庫的使用者sid對應不上所以就成了孤立使用者 每個login有唯一的sid,域賬號為域裡的sid select f...
SQL Server 孤立使用者詳解
sql server 的使用者安全管理分兩層,整個sql server 伺服器一層,每個資料庫一層。登入帳號對於伺服器而言的,資料庫使用者是針對特定資料庫來講的。就相當於乙個房間裡放著很多保險櫃,你有房門鑰匙了,必須得有每個保險櫃的鑰匙才能從保險櫃裡取東西。登入帳戶是房門鑰匙,資料庫使用者是保險櫃鑰...
SQL Server 孤立使用者檢測與處理
sql server 登入名使用對映到 sql server 登入名的資料庫使用者訪問各個資料庫。此規則有兩種例外情況 有關 sql server 登入名與資料庫使用者的對映關係的資訊儲存在資料庫中。其中包括資料庫使用者的名稱以及對應 sql server 登入名的 sid。該資料庫使用者的許可權用...