如何在Azure中的地理冗余数据库上创建登录和用户?

时间:2016-05-16 22:11:26

标签: azure azure-sql-database geo-replication

我需要在地理复制数据库上创建登录和用户。将在此数据库上为用户授予“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 个答案:

答案 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'

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

答案 2 :(得分: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 

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

答案 3 :(得分:0)

您似乎无法访问master db。您是否尝试过通过其他登录访问master?如果不是,您可能希望在master中创建本地用户并使用它进行连接。