跨服务器从SQL Server向Access写入数据的链接服务器配置问题
我来帮你排查这个跨服务器写入Access MDB的问题——你已经在本地(Server B)的测试文件上成功配置了链接服务器,但跨到Server A就失败,结合你的描述,大概率是SQL Server服务账户的权限或者身份委派的问题,具体可以从这几个方向入手:
1. 检查SQL Server服务账户的共享访问权限
你自己能访问\\A\dep$\Data Workbench\Commercial\Pricing Project\PricingTest.mdb不代表SQL Server服务能访问——因为链接服务器的操作是由SQL Server的服务进程执行的,它用的是服务自身的登录账户(比如Local System、Network Service,或者某个域账户),而不是你登录SQL Server的用户账户。
排查步骤:
- 打开Server B的「服务」管理器,找到你的SQL Server实例服务,查看它的「登录身份」;
- 用这个账户登录到Server B(如果是域账户直接登录,Local System的话可以用
psexec工具启动命令行),尝试访问目标UNC路径下的MDB文件,看能不能打开、修改; - 如果无法访问,去Server A的共享文件夹(
dep$)和对应的NTFS文件夹,给这个SQL Server服务账户添加读写权限。
2. 配置Kerberos约束委派(Windows身份验证场景)
你设置的安全选项是「Be made using the login's current security context」,也就是传递当前登录用户的身份到目标资源。但跨服务器的身份传递需要Kerberos约束委派支持,否则会出现“双跳”问题(用户→Server B SQL Server→Server A共享,NTLM不支持这种跨服务器身份跳转)。
解决步骤:
- 在Active Directory中找到Server B的SQL Server服务账户;
- 打开账户属性的「委派」选项卡,选择「信任此用户用于指定服务的委派」,然后添加Server A的
CIFS服务(即文件共享服务); - 确保你的SQL Server和域控制器都配置了正确的SPN(服务主体名称),比如
MSSQLSvc/ServerB:1433。
3. 验证链接服务器的数据源配置
- 确认UNC路径没有拼写错误,包括大小写、空格(路径中的空格是允许的,但要确保链接服务器的数据源字段里路径完整正确);
- 不要使用映射网络驱动器(比如Z:),因为SQL Server服务账户的驱动器映射和你登录用户的是独立的,必须用完整的UNC路径。
4. 检查Access OLEDB提供程序的配置
如果你的SQL Server是64位,而Access MDB是32位,需要安装64位的Microsoft Access Database Engine(ACE)驱动,并且在链接服务器的提供程序属性中:
- 勾选「Allow inprocess」(允许进程内执行);
- 确保没有启用「Disallow adhoc access」(如果需要临时查询/写入的话)。
你也可以用OPENROWSET来快速测试写入,命令示例:
INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0', '\\A\dep$\Data Workbench\Commercial\Pricing Project\PricingTest.mdb';'admin';'', TargetTableName) SELECT * FROM ServerB.dbo.SourceTableName
如果这个命令报错,能给出更具体的错误信息,方便进一步定位问题。
内容的提问来源于stack exchange,提问作者DarrenB

