使用来自另一个数据库的用户/登录名

DMa*_*Man 2 security sql-server

是否可以在另一个(S)数据库中使用来自一个数据库(F)的登录名/用户?我知道我可以复制它,但是,当我将用户添加到 (F) 数据库时,我必须再次将它们全部复制(或将同一用户添加到 (S) 数据库)-我想避免这种情况...

我只想知道是否可以将安全/用户设置为来自另一个数据库的用户。

gbn*_*gbn 5

这意味着数据库用户没有匹配的服务器登录名。

也就是说,每个数据库sys.database_principalssys.server_principals 中都没有匹配项

对于 Windows 登录,这很容易。这会生成您缺少的 CREATE LOGINS

USE MyDB
SELECT
    'CREATE LOGIN ' + QUOTENAME(SUSER_SNAME(sid)) + ' FROM WINDOWS'
FROM
    sys.database_principals DP
WHERE
    DP.type IN ('G', 'U')
    AND 
    NOT EXISTS (SELECT * FROM sys.server_principals SP WHERE SP.sid = DP.sid);
Run Code Online (Sandbox Code Playgroud)

对于 SQL 登录,您需要使用正确的 SID 重新创建它。

SELECT 
    'CREATE LOGIN ' + QUOTENAME(DP.name) + 
                ' WITH PASSWORD = ''ChangeMe'', SID = ' + 
                CONVERT(varchar(128), sid, 1)
FROM
    sys.database_principals DP
WHERE
    DP.type = 'S' AND DP.principal_id > 4 
    AND 
    NOT EXISTS (SELECT * FROM sys.server_principals SP WHERE SP.sid = DP.sid);
Run Code Online (Sandbox Code Playgroud)

请注意,不推荐使用sp_change_users_login

现在,如果您的 SQL 登录名已经存在,则名称匹配但 sid 值不同。为此,您使用ALTER USER使用 LOGIN 选项。

最后,如果您有“旧”主数据库的备份,则可以重新创建 SQL 登录密码。如果您将其恢复为 FixLogins,那么您可以使用它

SELECT 
    'CREATE LOGIN ' + QUOTENAME(DP.name) + 
                ' WITH PASSWORD = ' + CONVERT(varchar(256), SL.password_hash, 1) + ' HASHED, SID = ' + 
                CONVERT(varchar(128), DP.sid, 1)

FROM
    sys.database_principals DP
    JOIN
    FixLogins.sys.sql_logins SL ON DP.sid = SL.sid  
WHERE
    DP.type = 'S' AND DP.principal_id > 4 
    AND 
    NOT EXISTS (SELECT * FROM sys.server_principals SP WHERE SP.sid = DP.sid);
Run Code Online (Sandbox Code Playgroud)