0

我有对表具有 INSERT 权限的用户。他们可以在发布者上插入记录,直到表的主要范围用完。然后他们每次尝试执行 INSERT 时都会收到此错误:

[Microsoft][ODBC SQL Server Driver]小数截断
[Microsoft][ODBC SQL Server Driver][SQL Server]插入失败。它与数据库“TaxDB”、复制表“dbo.ClientHistory”、列“ClientHistoryID”中的身份范围检查约束冲突。如果标识列由复制自动管理,则更新范围如下:对于发布者,执行 sp_adjustpublisheridentityrange;对于订阅服务器,运行分发代理或合并代理。
[Microsoft][ODBC SQL Server Driver][SQL Server]语句已终止。ODBC--在链接表“ClientHistory”上插入失败。

根据 SQL Server 2008 R2 的MS 文档

如果 Publisher 在插入后用尽了它的标识范围,如果插入是由 db_owner 固定数据库角色的成员执行的,它可以自动分配一个新的范围。如果插入是由不属于该角色的用户执行的,则日志读取器代理、合并代理或属于 db_owner 角色的用户必须运行sp_adjustpublisheridentityrange (Transact-SQL)

所以文档说用户必须是“db_owner”角色的成员,但他们没有说明原因。以下是自动生成的 MSmerge_ins 触发器之一中适用的 T-SQL 部分:

if is_member('db_owner') = 1
begin
    -- select the range values from the MSmerge_identity_range table
    -- this can be hardcoded if performance is a problem
    declare @range_begin numeric(38,0)
    declare @range_end numeric(38,0)
    declare @next_range_begin numeric(38,0)
    declare @next_range_end numeric(38,0)

    select @range_begin = range_begin,
           @range_end = range_end,
           @next_range_begin = next_range_begin,
           @next_range_end = next_range_end
        from dbo.MSmerge_identity_range where artid='A2D114CE-8436-48BF-9235-E47A059ACB13' and subid='2689FFDE-991E-4122-BFC2-C9739CC55917' and is_pub_range=0

    if @range_begin is not null and @range_end is not NULL and @next_range_begin is not null and @next_range_end is not NULL
    begin
        if IDENT_CURRENT('[dbo].[ClientHistory]') = @range_end
        begin
            DBCC CHECKIDENT ('[dbo].[ClientHistory]', RESEED, @next_range_begin) with no_infomsgs
        end
        else if IDENT_CURRENT('[dbo].[ClientHistory]') >= @next_range_end
        begin
            exec sys.sp_MSrefresh_publisher_idrange '[dbo].[ClientHistory]', '2689FFDE-991E-4122-BFC2-C9739CC55917', 'A2D114CE-8436-48BF-9235-E47A059ACB13', 2, 1
            if @@error<>0 or @retcode<>0
                goto FAILURE
        end
    end
end 

我想为对表具有 INSERT 权限(但权限有限)的用户提供从主要身份范围切换到辅助身份范围的能力。使这些用户成为“db_owner”不是一种选择。但是,给他们有限的额外权限当然是可能的。我只是不知道这些权限是什么。

由于自动标识范围管理在 SQL Server 2008 合并复制中默认打开,我错误地认为它会“开箱即用”。我开始认为我最好还是回到 NO 身份范围管理。真的,我只是希望我的用户能够插入记录,而无需管理员一直介入。

4

0 回答 0