我正在尝试使用以下命令将用户从我的实时服务器复制到我的 DR 服务器:
CREATE LOGIN [xxx]
WITH PASSWORD = 0x010006278DD83306AD19FA8B0CE4405F13DA83DDDFB25B088D7C HASHED
, SID = 0xFEEBD63ECD0F6A41AE60A6E0414F5A1D
, DEFAULT_DATABASE = [master]
, CHECK_POLICY = OFF
, CHECK_EXPIRATION = OFF
然后我得到一个错误:
消息 15433,级别 16,状态 1,行 1 提供的参数 sid 正在使用中。
所以我检查了 sys.syslogins:
SELECT *
FROM sys.syslogins
WHERE sid = '0xFEEBD63ECD0F6A41AE60A6E0414F5A1D'
这什么也没找到。所以我的问题是还有什么可以使用这个 sid?
正如@SteBov 在他的评论中指出的那样,将 sid 与其周围的引号进行比较是有问题的,因为这会强制对 sid 列执行隐式转换。由于转换会将十六进制值转换为字符值,因此您将永远不会在查询结果中看到登录。
如果检查以下语句的执行计划:
我们看到以下针对内部表 sys.sysxlgns 的聚集索引扫描:
在详细信息中,您可以看到以下谓词:
如果您运行 select 将其更改
CONVERT_IMPLICIT
为一个简单的CONVERT
语句,如下所示,您可以看到 sid 列不是您所期望的:为了成功找到具有重复 sid 的登录名,您需要像这样运行选择:
最好看一下,
sys.server_principals
因为syslogins是一个与 SQL Server 2000 兼容的视图,已被弃用。