断开数据库用户和 SQL Server 登录名之间的链接

Joh*_* N. 11 security sql-server permissions sql-server-2016

将数据库从一个实例还原到另一个实例时,有时必须将 SQL Server 登录名重新链接到数据库用户。

这通常是通过以下程序之一来实现的。

不推荐使用的 sp_change_users_login 存储过程

use <database>
go
sp_change_users_login 'Update_one', '<datbase_user>', '<sql server login>' 
go
Run Code Online (Sandbox Code Playgroud)

更改用户命令

use <database>
go
ALTER USER [<datbase_user>] WITH LOGIN = [<sql server login>]
go
Run Code Online (Sandbox Code Playgroud)

这些命令会将孤立的数据库用户重新链接到相应的 SQL Server 登录名。

是否可以在不删除 SQL Server 登录名或数据库用户的情况下打破这种关系?

原因

  • 删除数据库用户将删除数据库中的权限。
  • 删除 SQL Server 登录名将删除密码。(散列值;DBA 未知)
  • 我将数据库用户链接到作为Windows 系统帐户的 SQL Server 登录名。

研究

我已经查看了DMVsys.database_principalssys.server_principalsDMV,但它们不可修改。

Ton*_*kle 8

您可以通过一种迂回的方式完成此操作,即创建临时登录名,将用户重新映射到临时登录名,然后删除临时登录名。对于 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]
Run Code Online (Sandbox Code Playgroud)

对于 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
Run Code Online (Sandbox Code Playgroud)


Joh*_* N. 7

Tony 的回答最初非常接近,但仅适用于本机 SQL Server 登录名,而不适用于 Windows Authenticated SQL Server 登录名。但是,总体思路是一样的。

  1. 在本地服务器上创建一个 Windows 帐户:

     C:\> NET USER <account> /ADD
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建经过 Windows 身份验证的 SQL Server 登录名:

    USE [master]
    GO
    CREATE LOGIN [<server>\<account>] FROM WINDOWS WITH DEFAULT_DATABASE = [master]  
    GO
    
    Run Code Online (Sandbox Code Playgroud)
  3. 切换到有问题的数据库并将 Windows Authenticated SQL Server 登录链接到所需的数据库用户:

    注意:此步骤会将[<database_user>]您所在数据库中的重命名为Windows Authenticated SQL Server 登录名:[<server>\<account>]。记下名称以确保您可以重新命名。

    USE [<database>]
    GO
    ALTER USER [<database_user>] WITH LOGIN = [<server>\<account>]
    GO
    
    Run Code Online (Sandbox Code Playgroud)
  4. 删除之前创建的 Windows 身份验证 SQL Server 登录:

    USE [master]
    GO
    DROP LOGIN [<servername>\<account>]
    GO
    
    Run Code Online (Sandbox Code Playgroud)
  5. 将在步骤 3. 中重命名的数据库用户重命名为以前的名称:

    USE [<database>]
    GO
    ALTER USER [<servername>\<account>] WITH NAME = [<database_user>]
    GO
    
    Run Code Online (Sandbox Code Playgroud)
  6. 删除为此目的创建的本地帐户:

     C:\> NET USER <account> /DELETE
    
    Run Code Online (Sandbox Code Playgroud)

执行这些步骤后,[<database_user>]不再链接到 Windows 身份验证的 SQL Server 登录名。

请注意
此解决方案有一个主要警告。如果您实际上无法从 SQL Server 中删除 Windows Authenticated SQL Server 登录名,并且必须创建一个新的本地<account>来重新映射和删除,那么数据库用户的 SID 将在数据库中更改以反映操作。