Joh*_* N. 11 security sql-server permissions sql-server-2016
将数据库从一个实例还原到另一个实例时,有时必须将 SQL Server 登录名重新链接到数据库用户。
这通常是通过以下程序之一来实现的。
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 登录名或数据库用户的情况下打破这种关系?
我已经查看了DMVsys.database_principals和sys.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]
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)
Tony 的回答最初非常接近,但仅适用于本机 SQL Server 登录名,而不适用于 Windows Authenticated SQL Server 登录名。但是,总体思路是一样的。
在本地服务器上创建一个 Windows 帐户:
C:\> NET USER <account> /ADD
Run Code Online (Sandbox Code Playgroud)创建经过 Windows 身份验证的 SQL Server 登录名:
USE [master]
GO
CREATE LOGIN [<server>\<account>] FROM WINDOWS WITH DEFAULT_DATABASE = [master]
GO
Run Code Online (Sandbox Code Playgroud)切换到有问题的数据库并将 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)删除之前创建的 Windows 身份验证 SQL Server 登录:
USE [master]
GO
DROP LOGIN [<servername>\<account>]
GO
Run Code Online (Sandbox Code Playgroud)将在步骤 3. 中重命名的数据库用户重命名为以前的名称:
USE [<database>]
GO
ALTER USER [<servername>\<account>] WITH NAME = [<database_user>]
GO
Run Code Online (Sandbox Code Playgroud)删除为此目的创建的本地帐户:
C:\> NET USER <account> /DELETE
Run Code Online (Sandbox Code Playgroud)执行这些步骤后,[<database_user>]不再链接到 Windows 身份验证的 SQL Server 登录名。
请注意
此解决方案有一个主要警告。如果您实际上无法从 SQL Server 中删除 Windows Authenticated SQL Server 登录名,并且必须创建一个新的本地<account>来重新映射和删除,那么数据库用户的 SID 将在数据库中更改以反映操作。