我有一个数据库(DB1),它同步到另一台服务器上的(DB2)(通过 AlwaysOn - SQL Server 2014)。
我想授予用户对 DB2 的读取权限。我在 DB1 中创建了一个 SQL 登录名和数据库用户。新的数据库用户迁移到 DB2,但 SQL 登录没有(这是有道理的)。
问题是,当我尝试在 DB2 上为用户创建 SQL 登录名并授予用户对 DB2 的读取权限时,与来自 DB1 的用户帐户相关联,我收到一条错误消息,指出 DB2 是只读的,无法修改。
那么,我该如何实现呢?
我有一个数据库(DB1),它同步到另一台服务器上的(DB2)(通过 AlwaysOn - SQL Server 2014)。
我想授予用户对 DB2 的读取权限。我在 DB1 中创建了一个 SQL 登录名和数据库用户。新的数据库用户迁移到 DB2,但 SQL 登录没有(这是有道理的)。
问题是,当我尝试在 DB2 上为用户创建 SQL 登录名并授予用户对 DB2 的读取权限时,与来自 DB1 的用户帐户相关联,我收到一条错误消息,指出 DB2 是只读的,无法修改。
那么,我该如何实现呢?
您需要在 DB2 服务器上创建登录。使用Robert 的脚本来获取 sid 和密码,如果它是 SQL 帐户的话。
然后授予对 DB1 的权限。由于 AG,该权限将自动神奇地复制到 DB2。
没有办法只授予对 DB2 的权限。它必须在 DB1 上完成。不过,您可以通过禁用 DB1 上的登录来控制访问。
如果需要,一种自动同步您的 AG 副本之间的登录的选项,但也可以用作一次性的事情。
dbatools是一个模块,它提供了一些用于迁移 SQL Server 实例的代码,但我过去常常也让 AG 副本保持同步。
您需要简单同步登录的主要功能是
Copy-SqlLogin
. 这将包括通过 SSMS(数据库映射等)看到的 SID、密码和其他属性。Tara 引用的脚本具有类似的功能。仅该命令就会将登录信息从 DB1 复制到 DB2 并简单地同步任何更改的内容。因此,假设您将另一个数据库添加到 AG 并授予登录访问权限(映射用户),那么下次运行上述命令时,它将为您更新 DB2 上的登录。
为了完整起见,包含以下脚本只是为了显示可以做什么。我在客户端的 4 节点 AG 上构建了以下流程作为计划任务。如果您需要,这还提供了排除副本的能力;这是他们需要的东西。
您说您刚刚在第一台服务器上创建了登录,并将相应的用户迁移到 DB2。因此,您只需在第二台服务器上创建相同的登录名并保留它的 sid,您可以先从 sys.server_principals 复制登录名的 sid,然后使用with sid创建相同的登录名,如下所示:
当您在第二台服务器上创建相同的登录时,您必须确保使用与在主服务器上创建的相同的 SID 和密码来创建它。下面列出了我遵循的步骤:
执行以下存储过程,该过程是在步骤 1 中创建的,将“登录名”传递给它
复制上一步生成的脚本并在Secondary副本上执行
我相信这就是部分遏制旨在解决的问题。
请注意,如果您选择使用部分包含的数据库,有很多注意事项。
以下是您如何使用主节点进行设置(请记住在非生产环境中进行测试,以便您了解生产环境如何响应上述注意事项列表)。