SQL Server資料庫中還原孤立使用者的方法集合

2021-06-23 09:34:22 字數 3862 閱讀 6791

雖然sql server現在搬遷的技術越來越多,自帶的方法也越來越高階。

但是我們的sql server在搬遷的會出現很多孤立使用者,微軟沒有自動的處理。

因為我們的資料庫許可權表都不會在應用資料庫中,但是每次對資料庫作遷移的時候,單個資料庫卻帶著它的資料庫使用者物件。

並且我們在新的資料庫機器上也不能登入這些賬號,但是它卻靜悄悄的存在我們的資料庫中。

微軟以前提供的乙個老的介面儲存過程來處理這個問題。

sp_change_users_login

將現有資料庫使用者對映到 sql server 登入名。後續版本的 microsoft sql server 將刪除該功能。請避免在新的開發工作中使用該功能,並著手修改當前還在使用該功能的應用程式。 請改用 alter user。

雖然每次都在說以後的版本會不支援,但是用了好幾個版本還是支援的。

sp_change_users_login [ @action = ] 'action' 

[ , [ @usernamepattern = ] 'user' ]

[ , [ @loginname = ] 'login' ]

[ , [ @password = ] 'password' ]

[;]

[ @action = ] '

action'

說明過程要執行的操作。action 的資料型別為varchar(10)。action 可具有下列值之一。值說明

auto_fix

將當前資料庫的 sys.database_principals 系統目錄檢視中的使用者項鍊接到同名的 sql server 登入名。如果不存在同名的登入名,將會建立乙個。檢查auto_fix語句的結果,確認實際鏈結是否正確。在對安全性較為敏感的情況下,要避免使用auto_fix

如果使用auto_fix時登入名尚不存在,則必須指定 user 和 password,否則必須指定user,但password 將被忽略。login 必須為 null。user 必須是當前資料庫中的有效使用者。不能將另乙個使用者對映到該登入名。

report

列出當前資料庫中未鏈結到任何登入名的使用者以及相應的安全識別符號 (sid)。user、login 和 password 必須為 null 或不指定。

update_one

將當前資料庫中的指定 user 鏈結到現有 sql server login。必須指定 user 和 login。password 必須為 null 或不指定。

[ @usernamepattern = ] 'user'

當前資料庫中的使用者名稱。user 的資料型別為sysname,預設值為 null。

[ @loginname = ] 'login'

sql server 登入的名稱。login 的資料型別為sysname,預設值為 null。

[ @password = ] 'password'

通過指定auto_fix建立的新 sql server 登入名分配的密碼。如果已存在匹配的登入名,則對映該使用者名稱與登入名且忽略password。如果不存在匹配的登入名,則 sp_change_users_login 建立新的 sql server 登入名並分配password作為新登入名的密碼。password 的資料型別為sysname,且不能為 null。

0(成功)或 1(失敗)

列名資料型別

說明username

sysname

資料庫使用者名稱。

usersid

varbinary(85)

使用者的安全識別符號。

使用 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。

需要 db_owner 固定資料庫角色的成員身份。只有 sysadmin 固定伺服器角色的成員才能指定auto_fix選項。

下例生成當前資料庫中的使用者及其安全識別符號 (sid) 的報告。

exec sp_change_users_login 'report';
在以下示例中,資料庫使用者與新的 sql server 登入名關聯。資料庫使用者mb-sales首先對映到另乙個登入名,然後重新對映到登入名maryb

--create the new login.

create login maryb with password = '982734snfdhhkjj3';

go--map database user mb-sales to login maryb.

use adventureworks2008r2;

goexec sp_change_users_login 'update_one', 'mb-sales', 'maryb';

go

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



/*很多做dba的朋友也許都會碰到乙個這樣的問題,

在資料還原到其他伺服器時,登入名會丟失,重建非常麻煩,

特別是資料庫使用者較多的的情況,其實這個問題解決非常簡單,

sql server 2005 及以前的產品,

sql server 提供了 sp_change_users_login儲存過程,(sql server 2008 須用alter user)

sp_change_users_login有三種動作:report,update_one和auto_fix

具體用法:*/

/*1.列出當前資料庫中的孤立使用者*/

exec sp_change_users_login 'report'

/*2.如果已有登入使用者,將使用者名稱對映為指定的登入名*/

exec sp_change_users_login 'update_one','使用者名稱','登入名'

or exec sp_change_users_login 'auto_fix','使用者名稱'

/*3.如果沒有建立登入使用者*/

exec sp_change_users_login 'auto_fix', '登入名', null, '登入密碼'

/*--相同名字可以使用,處理孤立使用者

--在單個資料庫上執行*/

exec sp_change_users_login 'auto_fix','db_writer'

exec sp_change_users_login 'auto_fix','db_reader'



SQL Server 資料庫還原

在sql server 2008 r2 裡,用ui還原資料庫有時候會失敗。可以考慮在cmd裡面輸入指令sqlcmd來還原。1 restore database newdb from disk c test yourdb.bak with move yourdb to c data yourdb.md...

sqlserver資料庫還原

資料庫還原 邏輯檔案 不是資料庫 的一部分。請使用 restore filelistonly 來列出邏輯檔名。資料庫名稱不一致,無法還原 可以先使用 restore filelistonly from disk d datacake bak 檢視邏輯名和邏輯檔案位址,把下列語句中 move logi...

SQLServer 還原資料庫

通過sqlserver的management studio可以還原,不過可能是我的雲主機效能太差,每次開啟再匯入都要卡一會。用命令列應該是能想到的最簡單的方法了,先把bat命令記下來 sqlcmd s 172 21 0 5 sqlexpress u sa p 123456 q restore dat...