DMa*_*Man 2 security sql-server
是否可以在另一个(S)数据库中使用来自一个数据库(F)的登录名/用户?我知道我可以复制它,但是,当我将用户添加到 (F) 数据库时,我必须再次将它们全部复制(或将同一用户添加到 (S) 数据库)-我想避免这种情况...
我只想知道是否可以将安全/用户设置为来自另一个数据库的用户。
这意味着数据库用户没有匹配的服务器登录名。
也就是说,每个数据库sys.database_principals在sys.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)
| 归档时间: |
|
| 查看次数: |
111 次 |
| 最近记录: |