在只读可用性组副本上使用sp_setapprole快照隔离错误



我正在调查 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)

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

Msg 3961,级别 16,状态 1,过程 sp_setapprole,第 44 行 [批处理 起始行 25] 数据库中的快照隔离事务失败 "AGTest",因为语句访问的对象是 由另一个并发事务中的 DDL 语句修改,此后 此事务的开始。 这是不允许的,因为元数据 未进行版本控制。对元数据的并发更新可能会导致 如果与快照隔离混合,则不一致。

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

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

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

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

最新更新