Sql Server 孤立使用者解決辦法

2021-09-08 01:56:50 字數 2531 閱讀 1673

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。該資料庫使用者的許可權用...