问题描述
我有两台服务器(A、B)连接在一起。在服务器 A 上,我有一个存储过程可以访问在服务器 B 上找到的表。我正在以下列方式访问该表:
SELECT
LoggedAt,ReturnDuration
FROM [serverB].[databaseName].[dbo].[tableName]
WHERE LoggedAt BETWEEN @StartTime AND @EndTime
AND ReturnDuration IS NOT NULL
作业是调用存储过程的一行:
EXEC [dbo].[storedProcedureName]
手动运行存储过程时,它成功而没有任何错误。但是,当我将存储过程放入作业并尝试执行它时,我收到以下错误消息:
-
作业失败。该作业由用户 domainName\userName 调用。运行的最后一步是步骤 1 (stepName)。作业被要求从第 1 步(stepName)开始。
-
以用户身份执行:NT AUTHORITY\SYstem。用户 domainName\sql01AGENT 登录失败。 [sqlSTATE 28000](错误 18456)。步骤失败。
在线寻求帮助,我设法发现错误可能是由于 domainName\sql01AGENT 没有被添加为 服务器 B 上的有效登录名。添加该登录名并授予它正确的用户映射(映射到我在服务器 B 上的数据库,使用 db_datareader、db_dataowner 和公共角色)并将登录状态设置为启用后,作业仍然失败并出现相同的错误。
我发现的另一个解决方案是以我自己而不是服务器代理的身份运行该步骤。但是,这给了我一个不同的错误,即“访问远程服务器被拒绝,因为当前的安全上下文不受信任。[sqlSTATE 42000](错误 15274)。步骤失败。”
任何帮助将不胜感激!
解决方法
如果您还没有,您可能会要求您的 DBA 在服务器对象 -> 链接服务器下向 ServerB 添加链接服务器