【问题标题】:Which permissions are required to synchronize two sql databases using Micorosoft Sync Framework with bulk procedures?使用 Microsoft Sync Framework 和批量过程同步两个 sql 数据库需要哪些权限?
【发布时间】:2017-11-03 13:54:12
【问题描述】:

我用 C# 编写了一个程序,使用 Microsoft Sync Framework 来同步两个 sql 数据库。成功配置服务器和客户端后, 我在启动同步的客户端上设置了以下权限:

GRANT VIEW CHANGE TRACKING ON OBJECT::dbo.My_Table to my_role
GRANT DELETE ON [dbo].[My_Table_tracking] TO [my_role] AS [dbo]
GRANT INSERT ON [dbo].[My_Table_tracking] TO [my_role] AS [dbo]
GRANT SELECT ON [dbo].[My_Table_tracking] TO [my_role] AS [dbo]
GRANT UPDATE ON [dbo].[My_Table_tracking] TO [my_role] AS [dbo]
GRANT DELETE ON [dbo].[scope_info] TO [my_role] AS [dbo]
GRANT INSERT ON [dbo].[scope_info] TO [my_role] AS [dbo]
GRANT SELECT ON [dbo].[scope_info] TO [my_role] AS [dbo]
GRANT UPDATE ON [dbo].[scope_info] TO [my_role] AS [dbo]
GRANT DELETE ON [dbo].[scope_config] TO [my_role] AS [dbo]
GRANT INSERT ON [dbo].[scope_config] TO [my_role] AS [dbo]
GRANT SELECT ON [dbo].[scope_config] TO [my_role] AS [dbo]
GRANT UPDATE ON [dbo].[scope_config] TO [my_role] AS [dbo]
GRANT EXECUTE ON [dbo].[My_Table_selectrow] TO [my_role] AS [dbo]
GRANT EXECUTE ON [dbo].[My_Table_update] TO [my_role] AS [dbo]
GRANT EXECUTE ON [dbo].[My_Table_updatemetadata] TO [my_role] AS [dbo]
GRANT EXECUTE ON [dbo].[My_Table_selectchanges] TO [my_role] AS [dbo]
GRANT EXECUTE ON [dbo].[My_Table_insertmetadata] TO [my_role] AS [dbo]
GRANT EXECUTE ON [dbo].[My_Table_insert] TO [my_role] AS [dbo]
GRANT EXECUTE ON [dbo].[My_Table_deletemetadata] TO [my_role] AS [dbo]
GRANT EXECUTE ON [dbo].[My_Table_delete] TO [my_role] AS [dbo]
GRANT EXECUTE ON [dbo].[My_Table_bulkupdate] TO [my_role] AS [dbo]
GRANT EXECUTE ON [dbo].[My_Table_bulkinsert] TO [my_role] AS [dbo]
GRANT EXECUTE ON [dbo].[My_Table_bulkdelete] TO [my_role] AS [dbo]

我使用以下资源将上面的脚本放在一起:

但是,当我运行程序时,会记录以下错误:

此 SqlParameterCollection 不包含具有 ParameterName '@changeTable' 的 SqlParameter

将执行查询的用户映射到内置的db_owner 角色后,程序可以完美运行。

有什么办法可以比较my_roledb_owner的有效权限吗?如何调试 sql server 的权限问题(ssms 中显示的 sql server 日志没有显示与我的问题相关的任何内容)?或者:使 Microsoft Sync Framework 将两个数据库与批量过程同步需要哪些确切的权限?

【问题讨论】:

    标签: sql-server permissions synchronization microsoft-sync-framework


    【解决方案1】:

    有什么办法,我可以比较一下授予的有效权限 my_role 和 db_owner?

    要查看您的角色成员拥有哪些权限,您应该模拟一个属于您的角色 my_role 成员的用户并检查其权限,如下所示:

    execute as user = 'my_user_member_of_my_role';
    select *
    from sys.fn_my_permissions(null, 'database');
    revert;
    

    然后检查db_owner 具有哪些权限:通过模拟db_owner 角色的某些成员来执行相同操作,或者如果您是sysadmin,则跳过模拟:

    execute as user = 'my_user_member_of_db_owner'; -- skip it if you are sysadmin
    select *
    from sys.fn_my_permissions(null, 'database');
    revert; -- skip it if you are sysadmin
    

    如何调试 sql server 的权限问题(sql server ssms 中显示的日志没有显示与我的问题相关的任何内容)?

    你应该意识到这个错误:

    具有 ParameterName '@changeTable' 的 SqlParameter 不包含在 这个 SqlParameterCollection

    不是 SQL Server 错误

    所以这是你的程序的错误,使用你的编程环境调试它。

    或者:制作 Microsoft Sync 需要哪些确切权限 框架用批量过程同步两个数据库?

    你应该执行什么确切的代码?

    如果您在此处列出您想要运行的命令,我会写给您执行此操作所需的所有必要权限。

    附:如果您使用BULK INSERT,您应该拥有ADMINISTER BULK OPERATIONS 服务器级别的权限。此权限未授予db_owners。因此,如果是问题所在,您无法通过将用户添加到 db_owner 数据库角色来解决它。

    【讨论】:

    • 感谢您指出 fn_my_permissions 函数,我现在正在使用它来进行比较。 on the microsoft forums 描述了对类似问题的非常详细的描述。
    【解决方案2】:

    负责批量操作的存储过程使用用户定义的表类型,该表类型以将要同步的表命名,例如Mytable_BulkType。要执行这些过程,用户需要对表类型具有以下权限:

    GRANT CONTROL ON TYPE::[dbo].[MyTable_BulkType] TO [my_role] AS [dbo]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-16
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多