列出孤立帐号

use 数据库名称
exec sp_change_users_login 'REPORT'

自动创建同名的登录名

exec sp_change_users_login 'AUTO_FIX','用户名'

如果登录名已存在,则可关联

exec sp_change_users_login 'UPDATE_ONE','用户名','登录名'

以上方法仅限于数据库可读写情况,对于只读数据库,比如日志镜像数据库,孤立用户不可直接关联登录名,因为需要在只读库中写入权限数据。

因此需要手动关联用户名和登录名,他们之间的关联不是通过名称关联的,而是登录标识符。

以数据库日志镜像为例,我们首先在主库上创建好帐号和权限。同时获取登录标识符。

例如,要同步的登录名是my_read。以下是获取登录标识符的方法。

select [sid] from sys.syslogins where name='my_read'
-- 返回:0xA00805D9B94B2E4082F4404C577A33B1

待数据同步至从数据库,则从数据库上会自动出现一个孤立帐号”my_read”。

此时莫慌。现在,再在从数据库上创建登录名,创建时指定从主库上复制过来的登录标识。

CREATE LOGIN my_read WITH PASSWORD = '登录密码',
SID = 0xA00805D9B94B2E4082F4404C577A33B1, -- 登录标识符,关键
DEFAULT_DATABASE = [dbname], --默认数据库
CHECK_EXPIRATION = OFF, --强制密码过期 关闭
CHECK_POLICY = OFF --强制密码策略 关闭

此时,用户不再是孤立的了。主库上的权限也可正常生效。