MS SQL 作业在具有 Windows 身份验证的链接服务器上运行存储过程

Posted

技术标签:

【中文标题】MS SQL 作业在具有 Windows 身份验证的链接服务器上运行存储过程【英文标题】:MS SQL Job running stored procedure over linked server with windows auth 【发布时间】:2020-01-08 09:27:07 【问题描述】:

我有安装了 SQLSRV01 和 SQLDB01 数据库的 SRV01 服务器。在该服务器上,我在 Windows SQLAgent 帐户下运行了 SQL Server 代理服务(无法更改)。此外,我将链接服务器设置为位于 SRV02 机器上的 SQLSRV02,该机器使用当前安全上下文进行身份验证。我有 Windows 用户 DOMAIN\IntegrationUser01 可以访问两台服务器上的两个数据库。 然后我创建了简单的存储过程,它从远程表中读取数据并将其写入本地(当我以 IntegrationUser01 身份登录到 SQLSRV01 时测试并工作)。 最后,我设置了作业来执行该存储过程。我将 DOMAIN\IntegrationUser01 设置为 JOB 的所有者,并设置为运行步骤的用户(步骤 -> 属性 -> 高级 -> 运行方式)。

它不起作用。作业执行以异常结束:

链接的服务器不能在没有映射的情况下被模拟使用 用于模拟登录。

据我了解,第一步中的 SQLAgent 帐户将自己模拟为 IntegrationUser01 以运行 JOB,然后需要能够通过链接服务器将这些凭据委托给 SRV02 以进行身份​​验证。由于没有 Kerberos 协议来处理第二个循环,它会在不存在的 SQLSRV02 服务器上查找到 SQL 用户的映射。

是否有可能在没有 Kerberos 的情况下建立这样的架构?或者我只是做错了什么?

【问题讨论】:

【参考方案1】:

如果可能,请尝试以下解决方案之一:

1) 提供对链接服务器上 SQL 代理服务帐户的访问权限

2) 转到服务器对象 > 链接服务器 > 选择服务器并转到属性 > 在安全选项卡中提供对链接服务器具有访问权限的用户名。

【讨论】:

1.) 我正在根据客户的要求工作。在我证明某些事情无法完成之前,我不能使用变通方法。 2.) 没那么简单。【参考方案2】:

我找到了解决方案并使用了 SQL Server 代理。不幸的是,它不适用于 T-SQL JOB Steps,但解决方法非常简单。

1.) 您需要在 SQL Server 中保存 DOMAIN\IntegrationUser01 windows 凭据(下面的 scr 中的 Internal_SQL_Credential_Name)(安全 -> 凭据)

2.) 您在 SQL Server 代理节点中为 CmdExe 子系统(下面 scr 中的 Internal_SQL_Proxy_Name)设置代理,并将其指向创建的凭据。

3.) 对于代理,您添加主体登录。由于这是 sql windows auth,因此您选择“DOMAIN\IntegrationUser01”

4.) 您将步骤类型更改为:CmdExe 并运行为:Internal_SQL_Proxy_Name(默认为 SQL Server 代理服务帐户)。

5.) 作为您设置的命令:SQLCMD -Q"EXEC DataBaseName.SchemaName.StoredProcedure" -E -S ServerName

【讨论】:

以上是关于MS SQL 作业在具有 Windows 身份验证的链接服务器上运行存储过程的主要内容,如果未能解决你的问题,请参考以下文章

为啥我使用 Windows 身份验证通过 AzureML dataprep 登录 MS SQL 失败?

使用Python通过Windows身份验证连接到MS SQL Server?

MS Access 2003 + 到 SQL Server 2005 的链接表 + Windows 身份验证 = 慢

为什么使用Windows身份验证登录使用AzureML dataprep的MS SQL失败?

SonarQube 在具有集成身份验证的 SQL Server 上作为 Windows 服务运行 - 有人有工作示例吗?

具有 Windows 身份验证的 sql server EXPRESS 实例没有创建数据库的任何权限