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