1. 程式人生 > >SQL Server數據庫中還原孤立用戶的方法集合

SQL Server數據庫中還原孤立用戶的方法集合

without 數據庫 對稱 高級 是我 都在 但是 min epo

SQL Server數據庫中還原孤立用戶的方法集合

雖然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 時登錄名尚不存在,則必須指定 userpassword,否則必須指定user,但password 將被忽略。login 必須為 NULL。user 必須是當前數據庫中的有效用戶。不能將另一個用戶映射到該登錄名。

Report

列出當前數據庫中未鏈接到任何登錄名的用戶以及相應的安全標識符 (SID)。userloginpassword 必須為 NULL 或不指定。

Update_One

將當前數據庫中的指定 user 鏈接到現有 SQL Server login。必須指定 userloginpassword 必須為 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 選項。

示例:

A. 顯示登錄映射的當前用戶的報告

下例生成當前數據庫中的用戶及其安全標識符 (SID) 的報告。

技術分享復制代碼
EXEC sp_change_users_login ‘Report‘;

B. 將數據庫用戶映射到新的 SQL Server 登錄名

在以下示例中,數據庫用戶與新的 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;
GO
EXEC sp_change_users_login ‘Update_One‘, ‘MB-Sales‘, ‘MaryB‘;
GO

C. 自動將用戶映射到登錄名(必要時新建一個登錄名)

以下示例顯示如何使用 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數據庫中還原孤立用戶的方法集合