SQL Server 孤立使用者檢測與處理

2021-08-26 19:42:29 字數 3113 閱讀 5945

sql server 登入名使用對映到 sql server 登入名的資料庫使用者訪問各個資料庫。此規則有兩種例外情況:

有關 sql server 登入名與資料庫使用者的對映關係的資訊儲存在資料庫中。其中包括資料庫使用者的名稱以及對應 sql server 登入名的 sid。該資料庫使用者的許可權用於在資料庫中進行授權。

在伺服器例項上未定義或錯誤定義了其相應 sql server 登入名的資料庫使用者無法登入到例項。這樣的使用者被稱為此伺服器例項上的資料庫的「孤立使用者」。如果刪除了對應的 sql server 登入名,則資料庫使用者可能會變為孤立使用者。另外,在資料庫還原或附加到 sql server 的其他例項之後,資料庫使用者也可能變為孤立使用者。如果未在新伺服器例項中提供資料庫使用者對映到的 sid,則該使用者可能變為孤立使用者。

簡單的說孤立使用者,就是資料庫中有這個使用者,但是沒有對應的登入使用者

檢測孤立使用者

use ;

go;sp_change_users_login @action='report';

go;

這樣找到的會不包含windows 孤立賬號,所以是不完整的,根據孤立使用者的特性可以根據以下語句找到所有的

select name

from sys.database_principals dp with(nolock)

where not exists(

select *

from sys.server_principals sp with(nolock)

where sp.sid = dp.sid

)and dp.type in(

's', 'g', 'u'

)and dp.sid is not null

and dp.sid <> 0x00

處理孤立賬號

1、可以使用sp_change_users_login 修復

以下示例顯示如何使用auto_fix將現有使用者對映到同名的登入名,以及如何在不存在登入名mary的情況下,建立密碼為b3r12-3x$098f6的sqlserver登入名mary。

seadventureworks;

goexecsp_change_users_login'auto_fix','mary',null,'b3r12-3x$098f6';go

需要注意的是

使用 sp_change_users_login 將當前資料庫中的資料庫使用者鏈結到 sql server 登入名。如果使用者登入名已更改,則使用 sp_change_users_login 將使用者鏈結到新的登入,而不會丟失使用者的許可權。新的 login 不能為 sa,而 user 不能為 dbo、guest 或 information_schema 使用者。

sp_change_users_login 不能用於將資料庫使用者對映到 windows 級主體、證書或非對稱金鑰。

sp_change_users_login 不能與通過 windows 主體建立的 sql server 登入名一起使用,也不能與使用 create user without login 建立的使用者一起使用。

不能在使用者定義的事務中執行 sp_change_users_login。

2、 如果這些賬號沒有用了,可以考慮直接刪除,附上乙個快速刪除的**

刪除當前庫的所有孤立使用者

declare @s varchar(1000)

if object_id('tempdb..#tb') is not null drop table #tb

create table #tb(username varchar(50))

insert into #tb

select name

from sys.database_principals dp with(nolock)

where not exists(

select *

from sys.server_principals sp with(nolock)

where sp.sid = dp.sid )

and dp.type in(

's', 'g', 'u' )

and dp.sid is not null

and dp.sid <> 0x00

if @@rowcount >0

begin

select @s=isnull(@s,'')+'drop user ['+username+'];'+char(13)from #tb

--print @s

exec (@s)

end

drop table #tb

刪除所有資料庫的孤立使用者

exec sp_msforeachdb

'use [?]

declare @s varchar(1000)

if object_id(''tempdb..#tb'') is not null drop table #tb

create table #tb(username varchar(50))

insert into #tb select name

from sys.database_principals dp with(nolock)

where not exists(

select *

from sys.server_principals sp with(nolock)

where sp.sid = dp.sid )

and dp.type in(

''s'', ''g'', ''u'' )

and dp.sid is not null

and dp.sid <> 0x00 ;

if @@rowcount >0

begin

select @s=isnull(@s,'''')+''drop user [''+username+''];''+char(13)from #tb

use [?]

--print @s

exec (@s)

enddrop table #tb '

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 ser 帳號,這些就是...