Sql Server 修复用户

meh*_*tfi 7 sql-server-2008 sql-server sql-server-2008-r2 sql-server-2012 logins

我使用以下命令在我的数据库中创建一个用户:

CREATE USER Test WITHOUT LOGIN
Run Code Online (Sandbox Code Playgroud)

我用测试名称创建了一个登录名。

我想将测试用户与测试登录联系起来。

当我使用以下命令时:

EXEC sp_change_users_login 'Update_One', 'Test', 'Test'
Run Code Online (Sandbox Code Playgroud)

SQL Server 引发了以下错误:

Msg 15291, Level 16, State 1, Procedure sp_change_users_login, Line 114
Terminating this procedure. The User name 'Test' is absent or invalid.
Run Code Online (Sandbox Code Playgroud)

当我使用以下命令时:

ALTER USER Test WITH LOGIN = Test
Run Code Online (Sandbox Code Playgroud)

SQL Server 引发波纹管错误:

Msg 33016, Level 16, State 1, Line 2
The user cannot be remapped to a login. Remapping can only be done for users that were mapped to Windows or SQL logins.
Run Code Online (Sandbox Code Playgroud)

如何将测试用户与测试登录联系起来。

此链接的目的是:我想将数据库从服务器还原到另一台服务器,并在完成还原后,将用户与服务器上的现有登录名进行映射。

提前致谢。

Seb*_*ine 10

WITHOUT LOGIN事后显式创建的用户无法映射到登录名。

使用登录名创建然后失去关联的用户,例如因为数据库被移动到另一台服务器,可以通过首先创建新登录名(任何名称)然后使用ALTER USER ... WITH LOGIN = ...命令来重新映射。

为了证明我要创建一个数据库tst,然后创建一个登录名tstlogin和相关用户tstusertst

CREATE DATABASE tst;
GO
CREATE LOGIN tstlogin WITH PASSWORD = 'passw8rd';
GO
USE tst;
GO
CREATE USER tstuser FOR LOGIN tstlogin;
Run Code Online (Sandbox Code Playgroud)

为了显示正确的关联,我们可以使用以下查询:

SELECT DP.sid,DP.name user_name, SP.name login_name
FROM sys.database_principals AS DP
LEFT JOIN sys.server_principals AS SP
ON DP.sid = SP.sid
WHERE DP.name = 'tstuser';
Run Code Online (Sandbox Code Playgroud)

这导致

SID                                        user_name      login_name
------------------------------------------ -------------- --------------
0xBF3D0CC874C72B469BEB4AA93845F59E         tstuser        tstlogin
Run Code Online (Sandbox Code Playgroud)

现在我们将删除登录 tstlogin

DROP LOGIN tstlogin;
Run Code Online (Sandbox Code Playgroud)

并重新检查我们的用户:

SELECT DP.sid,DP.name user_name, SP.name login_name
FROM sys.database_principals AS DP
LEFT JOIN sys.server_principals AS SP
ON DP.sid = SP.sid
WHERE DP.name = 'tstuser';
Run Code Online (Sandbox Code Playgroud)

不再显示关联的登录名:

SID                                        user_name      login_name
------------------------------------------ -------------- --------------
0xBF3D0CC874C72B469BEB4AA93845F59E         tstuser        NULL
Run Code Online (Sandbox Code Playgroud)

下一步是创建一个新的登录。(为了演示目的,我选择了一个不同的名称,但它也可以是相同的名称。)

CREATE LOGIN tstlogin2 WITH PASSWORD = 'passw8rd';
Run Code Online (Sandbox Code Playgroud)

要将新登录名与我们的用户相关联,我们可以使用以下ALTER USER语句:

ALTER USER tstuser WITH LOGIN = tstlogin2;
Run Code Online (Sandbox Code Playgroud)

再次检查关联:

SELECT DP.sid,DP.name user_name, SP.name login_name
FROM sys.database_principals AS DP
LEFT JOIN sys.server_principals AS SP
ON DP.sid = SP.sid
WHERE DP.name = 'tstuser';
Run Code Online (Sandbox Code Playgroud)

表明ALTER语句成功:

SID                                        user_name      login_name
------------------------------------------ -------------- --------------
0xBF3D0CC874C72B469BEB4AA93845F59E         tstuser        tstlogin2
Run Code Online (Sandbox Code Playgroud)

如果您确实需要将“ WITHOUT LOGIN”用户更改为“登录”用户,则必须删除该用户并重新创建它。在这种情况下,请确保首先编写权限脚本,因为删除用户会导致 SQL Server 忘记这些权限。