跨服务器SQL存储过程是指存储过程内部通过链接服务器访问其他数据库实例的对象,这类存储过程在服务器迁移场景中需要同时处理存储过程本身、链接服务器配置、权限体系三部分的迁移,否则很容易出现执行异常。

迁移前的准备工作
在正式迁移前需要先完成基础信息梳理,避免迁移过程中遗漏关键配置。首先需要导出原服务器上所有跨服务器存储过程的创建脚本,同时记录存储过程中调用的所有链接服务器名称,以及链接服务器对应的目标服务器地址、登录方式。其次需要整理原服务器上存储过程归属的用户、角色,以及链接服务器配置的权限信息,包括本地登录映射、远程用户权限等。
导出存储过程脚本
可以通过SQL Server Management Studio的脚本生成功能批量导出,也可以使用以下查询语句获取单个存储过程的创建脚本:
-- 查询指定跨服务器存储过程的创建脚本
SELECT
OBJECT_DEFINITION(OBJECT_ID('存储过程名称')) AS ProcedureScript
WHERE
OBJECT_ID('存储过程名称') IS NOT NULL
链接服务器的迁移处理
链接服务器是跨服务器存储过程能够访问远程实例的核心,迁移时需要先在新服务器上重建链接服务器配置,保证配置参数与原服务器一致。
创建链接服务器
如果原链接服务器使用SQL Server身份验证,可以使用以下脚本在新服务器上创建链接服务器:
-- 创建链接服务器
EXEC sp_addlinkedserver
@server = '远程服务器别名', -- 链接服务器名称,需与原存储过程中使用的名称一致
@srvproduct = '',
@provider = 'SQLNCLI',
@datasrc = '192.168.0.1,1433' -- 目标服务器地址和端口
-- 配置链接服务器登录映射
EXEC sp_addlinkedsrvlogin
@rmtsrvname = '远程服务器别名',
@useself = 'false',
@locallogin = NULL, -- 所有本地登录都使用以下远程登录
@rmtuser = '远程数据库用户名',
@rmtpassword = '远程数据库密码'
如果原链接服务器使用Windows身份验证,需要将@useself参数设置为true,同时不需要配置@rmtuser和@rmtpassword参数。
验证链接服务器可用性
创建完成后可以先测试链接服务器是否正常连接,避免存储过程迁移后执行失败:
-- 测试链接服务器连接 SELECT * FROM [远程服务器别名].[目标数据库名].[dbo].[测试表名]
存储过程与权限的迁移
链接服务器配置完成后,就可以迁移存储过程本身,同时同步对应的权限配置。
迁移存储过程
将之前导出的存储过程创建脚本在新服务器的目标数据库中执行,注意如果存储过程依赖的用户定义类型、函数等对象也需要提前迁移。执行完成后可以查看存储过程是否创建成功:
-- 查看存储过程是否存在 SELECT name FROM sys.procedures WHERE name = '存储过程名称'
权限迁移
存储过程迁移后需要同步原有权限,包括存储过程的执行权限、存储过程内部访问链接服务器的权限。首先同步存储过程的执行权限:
-- 授予用户存储过程执行权限 GRANT EXECUTE ON [dbo].[存储过程名称] TO [用户名] -- 授予角色存储过程执行权限 GRANT EXECUTE ON [dbo].[存储过程名称] TO [角色名]
其次需要保证链接服务器的登录映射对应的远程用户,在目标服务器上有对应表的查询、写入等权限,否则存储过程执行时会出现权限不足的错误。
常见问题排查
- 存储过程执行提示链接服务器不存在:检查链接服务器名称是否和存储过程中使用的名称完全一致,是否存在拼写错误。
- 执行提示权限不足:检查本地用户是否有存储过程执行权限,链接服务器映射的远程用户是否有对应远程对象的操作权限。
- 链接服务器连接超时:检查目标服务器地址、端口是否正确,防火墙是否开放了对应端口,远程服务器是否允许远程连接。
迁移验证
所有配置完成后,需要执行存储过程验证迁移是否成功,对比执行结果和原服务器上的执行结果是否一致,确认数据查询、写入逻辑都正常,整个迁移流程才算完成。