Sql-Server

斷開數據庫使用者和 SQL Server 登錄之間的連結

  • May 15, 2020

將數據庫從一個實例還原到另一個實例時,有時必須將 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_principalssys.server_principalsDMV,但它們是不可修改的。

您可以通過一種迂迴的方式完成此操作,即創建一個臨時登錄名,將使用者重新映射到臨時登錄名,然後刪除臨時登錄名。對於 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。但是,總體構想是一樣的。

  1. 在本地伺服器上創建一個 Windows 帳戶:
C:\> NET USER <account> /ADD
  1. 創建 Windows Authenticated SQL Server 登錄:
USE [master]
GO
CREATE LOGIN [<server>\<account>] FROM WINDOWS WITH DEFAULT_DATABASE = [master]  
GO
  1. 切換到有問題的數據庫並將 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
  1. 刪除之前創建的 Windows Autheticated SQL Server 登錄:
USE [master]
GO
DROP LOGIN [<servername>\<account>]
GO
  1. 將在步驟 3 中重命名的數據庫使用者重命名為以前的名稱:
USE [<database>]
GO
ALTER USER [<servername>\<account>] WITH NAME = [<database_user>]
GO
  1. 刪除為此目的創建的本地帳戶:
C:\> NET USER <account> /DELETE

執行這些步驟後,[<database_user>]不再連結到 Windows Authenticated SQL Server Login。

請注意

,此解決方案有一個主要警告。如果您實際上無法從 SQL Server 中刪除 Windows Authenticated SQL Server Login,並且您必須創建一個新的本地<account>來重新映射和刪除,那麼數據庫使用者的 SID 會在數據庫中更改以反映操作。

引用自:https://dba.stackexchange.com/questions/267219