我们在其中一个程序中使用合并复制,我希望允许我们的用户根据需要强制将他们的笔记本电脑与发布者同步(我们使用推送订阅)。我使用REPLMERG.EXE(see my previous question)来完成这项工作。
但是,当用户trid运行脚本时,他们收到以下错误消息:
只有sysadmin或db_owner角色的成员才能执行此操作 ...
exec sp_MSreplcheck_subscribe
...
如果我在本地订阅数据库中将用户组登录添加为db_owner,则脚本可以正常工作。问题是他们最终还是对本地数据库中的每个表都有完全访问权限,这不是我们可以忍受的。
允许合并复制拓扑中的用户按需同步他们的本地推送订阅而不给他们全面控制数据库似乎是一个非常简单的用例,但我无法让它工作。
答案 0 :(得分:2)
来自Replication Agent Security Model:
合并代理以获取订阅
Windows帐户下的 代理运行在它生成时使用 与订阅者的连接。这个 帐户必须至少是db_owner 固定数据库角色的成员 订阅数据库。
用于连接发布服务器和分发服务器的帐户必须:
- 成为PAL的成员。
- 是与发布数据库中的用户关联的登录名。
- 是与分发数据库中的用户关联的登录名。该 user可以是Guest用户。
- 拥有快照共享的读取权限。
因此,合并复制的文档要求是运行复制代理的帐户(replmerge.exe)是db_owner的成员。如果这对您的情况不起作用,那么合并复制不是正确的技术,因为它有一个您无法填写的要求。
现在理论上,应用程序可以执行REPLMERGE从其他应用程序执行的任何操作,并且您可以利用代码签名的强大功能来运行一组通过代码签名授予dbo权限的包装程序,因此不需要提升登录,但是这只是理论,因为复制过程不是很容易使用,也没有记录在需要重新实现代理的级别......
答案 1 :(得分:0)
怀疑者必须有权复制发布者发送的数据定义说明。这些指令中的一些甚至可能导致订户的重新初始化,这需要权限来重新创建相应的数据库。在这些情况下,Microsoft设置的安全要求听起来非常明智。
答案 2 :(得分:0)
正如Remus和Philippe所指出的那样,订阅db上的db_owner是同步合并推送订阅的硬性要求。但是,我们真的希望允许我们的用户同步他们自己的笔记本电脑而不给他们数据库的完整db_owner权限。
我们的解决方案是在订阅者上启用混合模式身份验证,并添加一个SQL Server用户,其唯一目的是使我们的最终用户能够同步他们的笔记本电脑。 SQL Server用户“syncuser”在本地订阅数据库上获得了db_owner角色。然后,当我们从程序中调用replmerg.exe时,我们指定了以下开关:
-SubscriberSecurityMode 0 -SubscriberLogin syncuser -SubscriberPassword 4w3 $ 0m3_P4 $$ w0Rd