Alwayson辅助副本上如何创建同步账号

时间:2022-08-16 01:27:38

alwayson的辅助副本无法创建数据库用户, 这点比较致命。 

但是否无法创建数据库用户了呢?也不是, 不过只能在主副本创建登录名和数据库用户, 然后在辅助副本上设置相同sid的登录名。


方法一:sid

具体步骤如下:

步骤1:查看主库上该账号的sid

查看语句为:SELECT *FROM [数据库名称]..sysusers

步骤2:在副本数据库上创建对应账号。

创建语句为:CREATE LOGIN [帐号]WITHPASSWORD=N'密码',

SID =0x731F7AD13044364D8F02EAE4C3BFB571,DEFAULT_DATABASE=[数据库名称],

 CHECK_EXPIRATION=OFF,CHECK_POLICY=OFF

其中 sid对应的值是主库上所查到的sid的值。


方法二:高总的脚本

--导出登录脚本  注:可用于 alwayson 辅助副本同步密码或者服务器迁移。
SELECT 'CREATE LOGIN [' + p.name + '] '
+ CASE WHEN p.type IN ( 'U', 'G' ) THEN 'FROM windows '
ELSE ''
END + 'WITH ' + CASE WHEN p.type = 'S'
THEN 'password = '
+ master.sys.fn_varbintohexstr(l.password_hash)
+ ' hashed, ' + 'sid = '
+ master.sys.fn_varbintohexstr(l.sid)
+ ', check_expiration = '
+ CASE WHEN l.is_expiration_checked > 0
THEN 'ON, '
ELSE 'OFF, '
END + 'check_policy = '
+ CASE WHEN l.is_policy_checked > 0
THEN 'ON, '
ELSE 'OFF, '
END
+ CASE WHEN l.credential_id > 0
THEN 'credential = ' + c.name
+ ', '
ELSE ''
END
ELSE ''
END + 'default_database = '
+ p.default_database_name
+ CASE WHEN LEN(p.default_language_name) > 0
THEN ', default_language = ' + p.default_language_name
ELSE ''
END
FROM sys.server_principals p
LEFT JOIN sys.sql_logins l
ON p.principal_id = l.principal_id
LEFT JOIN sys.credentials c
ON l.credential_id = c.credential_id
WHERE p.type IN ( 'S', 'U', 'G' )
AND p.name NOT IN ( 'sa')
AND p.name NOT LIKE '%##%'
AND p.name NOT LIKE '%NT SERVICE%'
AND p.name NOT LIKE '%NT AUTHORITY%'


方法三:

点击打开链接