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