4

我需要在地理复制数据库上创建登录名和用户。用户将被授予此数据库上的“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)
  1. 这是在异地复制数据库中设置登录的正确方法吗?
  2. 如何在这些数据库上设置用户?
4

4 回答 4

3

您也应该使用从主服务器获取的 SID 在另一台服务器上创建登录名。否则,您可以使用 SQL server / db 中的包含用户功能,以便将用户自动复制到只读副本。

于 2016-05-16T23:59:40.280 回答
1

我遇到了同样的问题,以下对我有用。我有启用了活动异地复制的 Azure SQL Server。

  1. 确保将您的 IP 地址添加到现有和新服务器的防火墙中。

master主服务器的数据库上:

  1. 创建登录
CREATE LOGIN geo_user WITH PASSWORD = 'secure-password'
  1. 创建对应的用户并将其分配给 dbmanager 角色(您可以根据需要分配适当的角色)
CREATE USER geo_user FOR LOGIN geo_user

ALTER ROLE dbmanager ADD MEMBER geo_user 
  1. 记下新登录的 SID:
SELECT sid FROM sys.sql_logins WHERE name = 'geo_user'

source主服务器的数据库上:

  1. 为相同的登录创建用户:
CREATE USER geo_user FOR LOGIN geo_user
  1. 将用户添加到 db_owner 角色:
ALTER ROLE db_owner add MEMBER geo_user

master辅助服务器上:

  1. 创建与主服务器上相同的登录名(使用与第 4 步相同的用户名、密码和 SID):
CREATE LOGIN geo_user with password = 'secure-password', sid=0x01060000000000640000000000000000A0D03563024DA846ADBCF33D31B6C026
  1. 创建相应的用户并将其分配给 dbmanager 角色:
CREATE USER geo_user FOR LOGIN geo_user

ALTER ROLE dbmanager ADD MEMBER geo_user 

现在您应该能够使用此用户登录到新服务器并查询数据库。

于 2021-06-23T21:43:59.510 回答
1

看来您没有对主数据库的本地访问权限。您是否尝试过通过不同的登录名访问 master?如果没有,您可能希望在 master 中创建一个本地用户并使用它进行连接。

于 2016-05-23T20:21:11.673 回答
1

你应该contained users改用。这些用户包含在数据库中,与异地复制同步,不需要从master表中额外登录。

创建一个包含密码的用户db_owner

USE mydatabase;
CREATE USER myuser WITH PASSWORD = 'secret';
EXEC sp_addrolemember 'db_owner', 'myuser'

更多信息:https ://docs.microsoft.com/en-us/sql/relational-databases/security/contained-database-users-making-your-database-portable?view=sql-server-ver15

于 2020-06-03T13:03:38.853 回答