我需要在地理复制数据库上创建登录和用户。将在此数据库上为用户授予“db_datareader”角色。
尝试的方法是使用SID(相同的标识)参数,如下所示:
-- 1. PRIMARY_DATABASE: Run on master database of Primary Database to create login
CREATE LOGIN [LOGINUSER] WITH password='XYZ'
GO
-- 2. Select details for created SQL login
SELECT [name], [sid]
FROM [sys].[sql_logins]
WHERE [type_desc] = 'SQL_Login'
AND [name] = 'LOGINUSER'
GO
-- 3. SECONDARY_DATABASE: Run on master database of Secondary Database to create login with associated SID
CREATE LOGIN [LOGINUSER]
WITH PASSWORD = 'XYZ',
SID = <SID from Step 2>
GO
虽然登录创建在两个数据库上都能正常工作,但我被允许访问PRIMARY_DATABASE,并拒绝访问SECONDARY_DATABASE并出现以下错误:
The server principal "LOGINUSER" is not able to access the database "master" under the current security context.
Cannot open user default database. Login failed.
Login failed for user 'LOGINUSER'. (Microsoft SQL Server, Error: 916)
答案 0 :(得分:2)
您也应该从主服务器上获取的SID在其他服务器上创建登录。否则,您可以在SQL server / db中使用包含的用户功能,以便用户自动复制到只读副本。
答案 1 :(得分:1)
您应该改用contained users
。这些用户包含在数据库中,并与地理复制同步,并且不需要master
表中的额外登录。
使用密码db_owner
创建一个包含的用户:
USE mydatabase;
CREATE USER myuser WITH PASSWORD = 'secret';
EXEC sp_addrolemember 'db_owner', 'myuser'
答案 2 :(得分:1)
我遇到了同样的问题,以下对我有用。我有启用了活动异地复制的 Azure SQL Server。
在主服务器的 master
数据库上:
CREATE LOGIN geo_user WITH PASSWORD = 'secure-password'
CREATE USER geo_user FOR LOGIN geo_user
ALTER ROLE dbmanager ADD MEMBER geo_user
SELECT sid FROM sys.sql_logins WHERE name = 'geo_user'
在主服务器的 source
数据库上:
CREATE USER geo_user FOR LOGIN geo_user
ALTER ROLE db_owner add MEMBER geo_user
在辅助服务器的master
上:
CREATE LOGIN geo_user with password = 'secure-password', sid=0x01060000000000640000000000000000A0D03563024DA846ADBCF33D31B6C026
CREATE USER geo_user FOR LOGIN geo_user
ALTER ROLE dbmanager ADD MEMBER geo_user
现在您应该可以使用该用户登录到新服务器并查询数据库。
答案 3 :(得分:0)
您似乎无法访问master db。您是否尝试过通过其他登录访问master?如果不是,您可能希望在master中创建本地用户并使用它进行连接。