如何为Azure MI SQL Agent执行账户授予链接服务器使用权限
解决Azure托管实例中SQL Agent访问链接服务器的权限问题
问题回顾
- 已在Azure托管实例(Azure MI)上创建仅对特定登录账户开放的链接服务器
- SQL Agent作业需要使用该链接服务器,但默认服务账户
User Manager\ContainerAdministrator无法通过sp_addlinkedsrvlogin添加映射,作业执行时因无登录映射被拒绝访问
原因
Azure MI的User Manager\ContainerAdministrator是内部系统账户,并非实例上的常规登录名,因此无法通过sp_addlinkedsrvlogin进行链接服务器的身份映射。
正确解决方案:使用SQL Agent代理账户
通过创建代理账户,让作业以具备链接服务器访问权限的自定义账户身份执行,具体步骤如下:
创建凭据
先创建关联目标登录账户的凭据,用于代理账户的身份验证:CREATE CREDENTIAL [LinkedServerAccessCredential] WITH IDENTITY = N'本地有权访问链接服务器的登录名', SECRET = N'该登录名的密码';创建代理账户
将凭据绑定到代理账户,并授予其执行TSQL作业步骤的权限(若作业是其他类型,需替换对应子系统ID):-- 创建代理 EXEC msdb.dbo.sp_add_proxy @proxy_name = N'LinkedServerJobProxy', @credential_name = N'LinkedServerAccessCredential', @enabled = 1; -- 授予代理使用TSQL子系统的权限 EXEC msdb.dbo.sp_grant_proxy_to_subsystem @proxy_name = N'LinkedServerJobProxy', @subsystem_id = 3; -- 3对应TSQL子系统,其他子系统ID可参考官方文档配置链接服务器登录映射
确保代理账户关联的本地登录名已被添加到链接服务器的映射中:EXEC sp_addlinkedsrvlogin @rmtsrvname = N'你的链接服务器名称', @useself = N'False', @locallogin = N'本地有权访问链接服务器的登录名', @rmtuser = N'远程服务器的登录账户', @rmtpassword = N'远程服务器登录账户的密码';修改作业步骤的运行身份
编辑SQL Agent作业的目标步骤,将“运行身份”从默认的SQL Agent服务账户切换为刚创建的LinkedServerJobProxy代理账户。
为什么不推荐临时方案?
- 开放所有登录访问链接服务器会带来严重的安全风险,违反最小权限原则
- 迁移作业到常规SQL Server会增加架构复杂度和维护成本,完全没必要——Azure MI本身支持代理账户的方式解决此问题
内容的提问来源于stack exchange,提问作者Peter E
相关产品推荐
相关产品推荐

