我正在调查SQL Server Always On Availability Groups,并且在只读副本数据库上设置应用程序角色时遇到了问题。真正让我烦恼的是行为,我不知道如何解释错误信息。
我所做的只是致电
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,Level 16,State 1,Procedure sp_setapprole,Line 44 [Batch 第25行] 数据库中的快照隔离事务失败 'AGTest'因为语句访问的对象已经存在 自从另一个并发事务中的DDL语句修改 这笔交易的开始。由于元数据,它是不允许的 没有版本。可以导致对元数据的并发更新 如果与快照隔离混合,则不一致。
当我在主数据库上执行相同的语句时,我可以再次在副本上设置批准 - 一次。
我测试了不同的隔离级别设置(虽然我不愿意为后来的高效数据库更改它),但这不起作用。我目前没有进一步的解决方法,谷歌几乎没有我的信息。
答案 0 :(得分:0)
总结一下(对于那些可能遇到类似问题的人):这是一个SQL Server
错误,由Microsoft在我提出支持请求(SP2 CU4)后修复。不幸的是,该修复程序似乎仅可用于 SQL Server 2016 ,2017年没有继承它-我希望它将在2019年发布,否则我将不得不创建一个新的支持案例。