1

我正在调查 SQL Server Always On 可用性组,在只读副本数据库上设置应用程序角色时遇到了问题。真正让我恼火的是这种行为,我不知道如何解释错误信息。

我所做的就是打电话

DECLARE @cookie varbinary(8000);

EXEC sys.sp_setapprole
    @rolename = 'TestRole', -- sysname
    @password = 'password', -- sysname
    @fCreateCookie = 1, -- bit
    @cookie = @cookie OUTPUT; -- varbinary(8000)

EXEC sys.sp_unsetapprole @cookie = @cookie; -- varbinary(8000)

第一次尝试效果很好。在第二次和所有以下尝试中,我收到以下错误:

消息 3961,级别 16,状态 1,过程 sp_setapprole,第 44 行 [批处理开始第 25 行] 数据库“AGTest”中的快照隔离事务失败,因为该语句访问的对象自启动以来已被另一个并发事务中的 DDL 语句修改本次交易。这是不允许的,因为元数据没有版本化。如果与快照隔离混合,对元数据的并发更新可能会导致不一致。

当我在主数据库上执行相同的语句时,我可以再次在副本上设置 approle - 一次。

我测试了不同的隔离级别设置(尽管我不愿意为后来的生产数据库更改它),但没有奏效。我目前没有进一步的方法来解决这个问题,谷歌几乎没有我的信息。

4

1 回答 1

0

总结一下(对于那些可能遇到类似问题的人):这是一个SQL Server错误,在我提交支持请求(SP2 CU4)后由微软修复。不幸的是,该修复似乎仅适用于SQL Server 2016,2017 没有继承它 - 我希望它将成为 2019 的一部分,否则我将不得不创建一个新的支持案例。

https://support.microsoft.com/en-us/help/4469908/error-3961-when-you-use-application-roles-read-only-secondary-replicas

于 2019-07-26T06:52:29.000 回答