解决 Sitecore xdbautomationworker 容器的 SQL Server 连接问题

问题描述

在将 Sitecore 数据库从生产环境迁移到非生产环境后,xdbautomationworker 容器出现了无法连接到 SQL Server 的问题。错误日志显示:

System.Data.SqlClient.SqlException (0x80131904): Only active directory users can impersonate other active directory users.

这个错误发生在尝试执行 Sitecore.Xdb.ReferenceData.SqlServer.Commands.GetDefinitionTypeCommand 时。

问题分析

  • 初步检查显示,所有相关的数据库连接字符串都使用了 SQL 身份验证。
  • 数据库用户似乎拥有足够的权限(db_datareader 和 db_datawriter 角色)。
  • 存储过程使用了 WITH EXECUTE AS OWNER 子句,这可能是导致问题的原因。

深入调查

我们进行了以下调查:

检查数据库所有者:

SELECT name , owner_sid 
FROM sys.databases

Non-Prod sys.databases

name owner_sid
master 0x01060000000001640000000000000000663E13D3D16A054F8DC5D166B11A8DACB1
Sitecore.Marketingautomation 0x16293186C9E12A4AA335B2F899274756777

Prod sys.databases

name owner_sid
master 0x01060000000001640000000000000000F38C7FCC4B939A43A85755A91FB7E8E718
Sitecore.Xdb.Collection.ShardMapManager 0x01060000000001640000000000000000F38C7FCC4B939A43A85755A91FB7E8E718

Non-Prod sys.database_principals

name principal_id type type_desc default_schema_name owning_principal_id sid
dbo 1 S SQL_USER dbo NULL 0x01
youradmin 5 S SQL_USER dbo NULL 0x01060000000001640000000000000000663E13D3D16A054F8DC5D166B11A8DACB1

关键发现

  • 非生产环境中,Sitecore 数据库的 owner_sid 与 master 数据库的 owner_sid 不同。
  • Sitecore 数据库的 owner_sid 不存在于 sys.database_principals 表中。
  • 生产环境中,所有数据库(包括 master)的 owner_sid 是一致的,并且与管理员用户的 SID 匹配。

解决方案

问题的根源是数据库所有权不一致。我们通过以下步骤解决了这个问题:

  1. 修正数据库所有权:
ALTER AUTHORIZATION ON DATABASE::[Sitecore.Marketingautomation] TO [admin_login];
ALTER AUTHORIZATION ON DATABASE::[Sitecore.Messaging] TO [admin_login];
ALTER AUTHORIZATION ON DATABASE::[Sitecore.Referencedata] TO [admin_login];

将 [admin_login] 替换为实际的管理员登录名。

  1. 验证数据库主体:
USE [DatabaseName];
SELECT name, type_desc, default_schema_name
FROM sys.database_principals
WHERE type IN ('S', 'U') AND name NOT IN ('dbo', 'guest', 'INFORMATION_SCHEMA', 'sys');
  1. 重新授予必要的权限(如果需要):
USE [Sitecore.Marketingautomation];
ALTER ROLE db_owner ADD MEMBER [mauser];

USE [Sitecore.Messaging];
ALTER ROLE db_owner ADD MEMBER [messaginguser];

USE [Sitecore.Referencedata];
ALTER ROLE db_owner ADD MEMBER [refdatauser];
  1. 检查 SQL Server 登录:
USE [master];
SELECT name, type_desc, is_disabled
FROM sys.server_principals
WHERE type IN ('S', 'U') AND name NOT LIKE '##%';

结论

这个问题突显了在迁移 Sitecore 数据库时,确保正确转移数据库所有权的重要性。不一致的数据库所有权可能导致权限问题,特别是当存储过程使用 EXECUTE AS OWNER 子句时。
在进行数据库迁移时,建议:

  • 记录源环境中的数据库所有权设置。
  • 在目标环境中重新创建相同的所有权结构。
  • 验证所有必要的登录和用户都存在并具有适当的权限。
  • 在迁移后进行全面的权限测试。

通过遵循这些步骤,我们成功解决了 xdbautomationworker 容器的连接问题,恢复了 Sitecore 环境的正常运行。

评论

还没有人评论,抢个沙发吧...

Viagle Blog

欢迎来到我的个人博客网站