在 SQL Server 中,如何为现有用户创建登录名?

epo*_*ter 19 login sql-server

我将一个数据库从一个 SQL Server 实例恢复到另一个 SQL Server 实例。数据库已经添加了用户。但是他们没有新 SQL Server 实例的登录名。

我知道如何为新用户创建新登录名,但如何为现有用户创建登录名?

Aar*_*els 13

我总是运行带有“Update_One”操作的sp_change_users_login命令来重新链接数据库用户和服务器登录:

sp_change_users_login 'Update_One', 'database user', 'server login'


squ*_*man 9

问题是恢复从原始服务器实例带回 db 用户,但新实例通常对这些用户登录一无所知。您将在 db 级别的 Security 下看到它们,但它们没有相应的服务器级别登录名。

您需要在恢复数据库的实例上重新附加具有服务器登录名的数据库用户。

有几种方法可以解决这个问题:

  1. 在新实例上为他们创建新登录名。然后,您必须将他们作为新实例上的数据库用户删除并添加他们的新登录名。鉴于您可以创建相同的登录名,这似乎很奇怪,但 SID(安全标识符)会有所不同,而这正是 SQL 用于用户识别的内容。这对于一两次登录来说很容易。

  2. 如果要在实例间维护相同的用户,保持相同的 SID,则使用sp_help_revlogin存储过程。从链接复制代码,该链接将创建必要的存储过程并在要从中复制用户的服务器上运行它。它将生成一个 SQL 脚本,您可以在目标服务器上运行该脚本以创建携带 SID、密码等所有内容的相同用户。如果您有很多数据库用户需要在目标实例上重新连接,或者如果您不知道源实例上一个或多个 SQL 登录的密码,则可以采用这种方法。


eri*_*ict 7

从 SQL Server 2012 开始,有一个 T-SQL 命令可以将现有用户分配给新登录名。创建登录名,但不要尝试进行用户映射(这会失败)。然后执行:

use <existing_database>;
alter user <existing_database_user> with login = <newly_created_login>;
Run Code Online (Sandbox Code Playgroud)

这会将现有登录映射到新用户。SQL 文档位于:https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-user-transact-sql ?view=sql-server-2017