本人是SpringBoot项目 使用MyBatis 连接SQL Server
在执行一个存储过程的时候报错:
"报错发生在 :ExceptionFactory.java 类中的 wrapException 方法中的第 30 行!原因是 :\n\r\n### Error querying database. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 无法在事务中执行过程 'sys.sp_dropserver'。\r\n### The error may exist in com/xxx/product/dc/dao/dao1/DxDxttSourceDao.java (best guess)\r\n### The error may involve com.xxx.product.dc.dao.dao1.DxDxttSourceDao.findInfo-Inline\r\n### The error occurred while setting parameters\r\n### SQL: {call dbo.etl_aa_xx_test(?,?,?,?,?,?)}\r\n### Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 无法在事务中执行过程 'sys.sp_dropserver'。"
网上找了半天没找到原因和解决办法;
查看了存储过程里面都是操作master.dbo.sp_addlinkedserver、master.dbo.sp_addlinkedsrvlogin、sp_serveroption、sp_testlinkedserver。看来是要创建链接服务器。
--执行执行存过语句
EXEC etl_xxxoxx_test 'name','SQLOLEDB','XXX.XXX.XXX.3','saXXX','doctorXXXX751','';
-- 这条语句会返回所有被标记为链接服务器的记录,也就是那些在 SQL Server 实例中配置为链接其他服务器的服务器信息
SELECT * FROM sys.servers WHERE is_linked = 1;--添加链接服务器
EXEC master.dbo.sp_addlinkedserver @server = 'name', @srvproduct='name', @provider='SQLOLEDB', @datasrc='XXX.XXX.XXX.3';
--配置链接服务器的登录信息
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname= 'name',@locallogin=NULL,@useself='False',@rmtuser= 'saXXX',@rmtpassword= 'doctorXXXX751';--配置服务器选项
EXEC sp_serveroption @server='name' , @optname= 'rpc', @optvalue ='TRUE';
--配置服务器选项
EXEC sp_serveroption @server='name' , @optname= 'rpc out', @optvalue='TRUE';
--测试链接服务器
EXEC sp_testlinkedserver N'name';
--删除链接服务器
exec sp_dropserver 'name','droplogins';
于是乎我就自己用SQL Sserver Manager把执行过程一条一条的执行;
发现数据库可以执行,但为啥程序里执行报错呢。怀疑是权限问题,最后使用了程序里配置的数据库账号和密码重新登录数据库发现执行语句报了一样的错:
Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 无法在事务中执行过程 'sys.sp_dropserver'。"
原来我执行成功的是使用的sa的权限,他有SQL Server的执行master库相关权限,而程序里配置的没有执行master库相关权限。破案