斷開數據庫使用者和 SQL Server 登錄之間的連結
將數據庫從一個實例還原到另一個實例時,有時必須將 SQL Server 登錄重新連結到數據庫使用者。
這通常通過以下過程之一來實現。
不推薦使用的 sp_change_users_login 儲存過程
use <database> go sp_change_users_login 'Update_one', '<datbase_user>', '<sql server login>' go
ALTER USER 命令
use <database> go ALTER USER [<datbase_user>] WITH LOGIN = [<sql server login>] go
這些命令會將孤立的數據庫使用者重新連結到相應的 SQL Server 登錄名。
問題
是否可以在不刪除 SQL Server 登錄名或數據庫使用者的情況下打破這種關係?
原因
- 刪除數據庫使用者將刪除數據庫中的權限。
- 刪除 SQL Server 登錄名將刪除密碼。(散列值;DBA 未知)
- 我將一個 Database User 連結到一個 SQL Server Login ,它是一個Windows System Account。
研究
我看過
sys.database_principals
和sys.server_principals
DMV,但它們是不可修改的。
您可以通過一種迂迴的方式完成此操作,即創建一個臨時登錄名,將使用者重新映射到臨時登錄名,然後刪除臨時登錄名。對於 SQL 登錄:
USE [master] CREATE LOGIN [temp_user] WITH PASSWORD=N'asdf' MUST_CHANGE, DEFAULT_DATABASE=[master], CHECK_EXPIRATION=ON, CHECK_POLICY=ON ALTER LOGIN [temp_user] DISABLE USE [test_database] ALTER USER test_user WITH LOGIN = [temp_user] DROP LOGIN [temp_user]
對於經過 Windows 身份驗證的登錄名/使用者,您需要創建一個臨時 Windows 帳戶,然後將其刪除,因此它不是 100% T-SQL 解決方案:
-- Create a Windows account with a name of Temp_User USE [master] CREATE LOGIN [COMPUTERNAME\Temp_User] FROM WINDOWS WITH DEFAULT_DATABASE=[master] ALTER LOGIN [COMPUTERNAME\Temp_User] DISABLE USE [test] ALTER USER [COMPUTERNAME\Existing_User] WITH LOGIN = [COMPUTERNAME\Temp_User] --Delete the Temp_User Windows account
Tony 的答案最初非常接近,但僅適用於 Native SQL Server Logins 而不適用於 Windows Authenticated SQL Server Logins。但是,總體構想是一樣的。
- 在本地伺服器上創建一個 Windows 帳戶:
C:\> NET USER <account> /ADD
- 創建 Windows Authenticated SQL Server 登錄:
USE [master] GO CREATE LOGIN [<server>\<account>] FROM WINDOWS WITH DEFAULT_DATABASE = [master] GO
- 切換到有問題的數據庫並將 Windows Authenticated SQL Server Login 連結到所需的數據庫使用者:
注意:此步驟會將
[<database_user>]
您所在的數據庫中的 重命名為 Windows Authenticated SQL Server 登錄名:[<server>\<account>]
。記下名稱以確保您可以重命名。USE [<database>] GO ALTER USER [<database_user>] WITH LOGIN = [<server>\<account>] GO
- 刪除之前創建的 Windows Autheticated SQL Server 登錄:
USE [master] GO DROP LOGIN [<servername>\<account>] GO
- 將在步驟 3 中重命名的數據庫使用者重命名為以前的名稱:
USE [<database>] GO ALTER USER [<servername>\<account>] WITH NAME = [<database_user>] GO
- 刪除為此目的創建的本地帳戶:
C:\> NET USER <account> /DELETE
執行這些步驟後,
[<database_user>]
不再連結到 Windows Authenticated SQL Server Login。請注意
,此解決方案有一個主要警告。如果您實際上無法從 SQL Server 中刪除 Windows Authenticated SQL Server Login,並且您必須創建一個新的本地
<account>
來重新映射和刪除,那麼數據庫使用者的 SID 會在數據庫中更改以反映操作。