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和相关用户tstuser中tst:
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 忘记这些权限。