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

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

我将数据库从一个 SQL Server 实例还原到另一个 SQL Server 实例。该数据库已添加用户。但他们没有新 SQL Server 实例的登录名。

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

答案1

问题是,还原会从原始服务器实例中恢复数据库用户,但新实例通常对这些用户登录一无所知。您会在数据库级别的“安全性”下看到它们,但它们没有相应的服务器级别登录。

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

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

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

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

答案2

我总是运行更改用户登录使用‘Update_One’操作命令重新链接数据库用户和服务器登录:

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

答案3

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

use <existing_database>;
alter user <existing_database_user> with login = <newly_created_login>;

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

答案4

以下是我发现的。

正如 squillman 所解释的那样,用户会随数据库一起复制,但登录名不会。您可以使用一个名为 sp_change_users_login 的存储过程来解决此问题。具体步骤请参见本文. 有关使用商店程序的详细信息,请参阅这一页

相关内容