计算机改名导致数据库链接的诡异问题

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介:

  前几天给开发部门部署测试数据库时,遇到一个很诡异的问题:创建一个链接服务器GEK-MIS01时,报错如下:

    消息 15190,级别 16,状态 1,过程 sp_dropserver,第 56 行

    仍有对服务器 'GEK-MIS01' 的远程登录或链接登录。

脚本如下(略去登录名等关键信息): 

/****** Object:  LinkedServer [GEK-MIS01]    Script Date: 07/05/2013 16:19:58 ******/
IF  EXISTS (SELECT srv.name FROM sys.servers srv WHERE srv.server_id != 0 AND srv.name = N'GEK-MIS01')EXEC master.dbo.sp_dropserver @server=N'GEK-MIS01', @droplogins='droplogins'
GO

/****** Object:  LinkedServer [GEK-MIS01]    Script Date: 07/05/2013 16:19:58 ******/
EXEC master.dbo.sp_addlinkedserver @server = N'GEK-MIS01', @srvproduct=N'SQL Server'

/* For security reasons the linked server remote logins password is changed with ######## */
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'GEK-MIS01',@useself=N'False',@locallogin=NULL,@rmtuser=N'username',@rmtpassword='*****'

GO

EXEC master.dbo.sp_serveroption @server=N'GEK-MIS01', @optname=N'collation compatible', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'GEK-MIS01', @optname=N'data access', @optvalue=N'true'
GO

EXEC master.dbo.sp_serveroption @server=N'GEK-MIS01', @optname=N'dist', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'GEK-MIS01', @optname=N'pub', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'GEK-MIS01', @optname=N'rpc', @optvalue=N'true'
GO

EXEC master.dbo.sp_serveroption @server=N'GEK-MIS01', @optname=N'rpc out', @optvalue=N'true'
GO

EXEC master.dbo.sp_serveroption @server=N'GEK-MIS01', @optname=N'sub', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'GEK-MIS01', @optname=N'connect timeout', @optvalue=N'0'
GO

EXEC master.dbo.sp_serveroption @server=N'GEK-MIS01', @optname=N'collation name', @optvalue=null
GO

EXEC master.dbo.sp_serveroption @server=N'GEK-MIS01', @optname=N'lazy schema validation', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'GEK-MIS01', @optname=N'query timeout', @optvalue=N'0'
GO

EXEC master.dbo.sp_serveroption @server=N'GEK-MIS01', @optname=N'use remote collation', @optvalue=N'false'
GO

 因为当时是一批脚本执行而且仅有这个脚本出错,当我准备查检查出错原因的时候,又有更紧急的事情要处理,就耽搁了处理这个问题,开发那边在测试过程发现这个数据库链接有问题,邮件反馈给我,我检查时居然发现很多不可思议的现象:

(1): 我用SSMS进入“服务器对象”——“链接服务器”下,居然看不到这个链接服务器对象,而通过sysservers等系统表又能查到这个服务器链接对象的信息,当时我就百思不得其解,纳尼啊?

(2) 重新执行上面脚本时发现删除链接服务器那段脚本根本删除不了该链接服务器,而添加链接服务器时则报错

   IF  EXISTS (SELECT srv.name FROM sys.servers srv WHERE srv.server_id != 0 AND srv.name = N'GEK-MIS01')

       EXEC master.dbo.sp_dropserver @server=N'GEK-MIS01', @droplogins='droplogins'

   GO

   EXEC master.dbo.sp_addlinkedserver @server = N'GEK-MIS01', @srvproduct=N'SQL Server'

  消息 15028,级别 16,状态 1,过程 sp_addlinkedserver,第 82 行

  服务器 'GEK-MIS01' 已存在。

(3):接下来我测试了下链接服务器的使用情况,发现有些登录名(Windows 身份认证,sysadmin角色)下使用该数据库链接没有问题,而SQL Server身份验证的登录名则会报下面错误:

  EXEC [GEK-MIS01].DatabaseName.dbo.Procedure  'xxxx'

  消息 916,级别 14,状态 1,第 1 行

  服务器主体 "username" 无法在当前安全上下文下访问数据库 "xxxxx"。

(4):而在SSMS下,在"服务器对象"—>“链接服务器”—> "GEK-MIS01"下单击目录时,报如下错误。

clipboard

具体错误信息如下:

标题: Microsoft SQL Server Management Studio
------------------------------

无法为该请求检索数据。 (Microsoft.SqlServer.Management.Sdk.Sfc)

有关帮助信息,请单击: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&LinkId=20476

------------------------------
其他信息:

执行 Transact-SQL 语句或批处理时发生了异常。 (Microsoft.SqlServer.ConnectionInfo)

------------------------------

拒绝了对对象 'xp_prop_oledb_provider' (数据库 'mssqlsystemresource',架构 'sys')的 EXECUTE 权限。 (Microsoft SQL Server,错误: 229)

有关帮助信息,请单击: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=10.50.4000&EvtSrc=MSSQLServer&EvtID=229&LinkId=20476

------------------------------
按钮:

确定
------------------------------

解决办法: 查看当前USER为guest, 执行下面赋权语句即可解决问题

SELECT CURRENT_USER;

GRANT EXECUTE ON SYS.XP_PROP_OLEDB_PROVIDER TO guest;

但是对于现象1,2,3则困扰了我好久,一直以为是权限问题,最后经过吐血的漫长 排查,终于发现一个让人吐血的原因:这台测试数据库服务器原先的计算机名称为gek-mis01,后来不知道啥原因被系统管理员用作测试服务器(历史原因 了我就不多说了),改名为GETTESTNT15,而一台新的服务器命名为gek-mis01,结果我今天新建链接服务器时,就踩到了这个地雷。

image

接下来解决起来就比较顺利了,首先删除该链接服务器,修复计算机改名问题,重新新建该链接数据库,OK,问题解决了!

Code Snippet
  1. exec sp_droplinkedsrvlogin'GEK-MIS01' ,'xxxxx'
  2.  
  3. exec sp_dropserver'GEK-MIS01'
  4.  
  5.  
  6. USE master;
  7. GO
  8. IF SERVERPROPERTY('servername') <> @@SERVERNAME
  9. BEGIN
  10. DECLARE @server sysname;
  11. SET @server =@@SERVERNAME;
  12. EXEC sp_dropserver@server= @server;
  13. SET @server = CAST(SERVERPROPERTY('servername') AS sysname);
  14. EXEC sp_addserver@server=@server, @local='LOCAL';
  15. END
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
23天前
|
Cloud Native 关系型数据库 Serverless
阿里云数据库获中国计算机学会“科技进步一等奖”!
阿里云数据库获中国计算机学会“科技进步一等奖”!
33 0
|
2月前
|
Java 关系型数据库 MySQL
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
这篇文章是关于如何使用Spring Boot框架通过JdbcTemplate操作MySQL数据库的教程。
72 0
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
|
2月前
|
数据库连接 网络安全 数据库
网站链接数据库失败,重启网站好了
网站链接数据库失败,重启网站好了
|
2月前
|
Java 关系型数据库 数据库连接
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第3天】Spring Boot项目中数据库连接问题可能源于配置错误或依赖缺失。YAML配置文件的格式不正确,如缩进错误,会导致解析失败;而数据库驱动不匹配、连接字符串或认证信息错误同样引发连接异常。解决方法包括检查并修正YAML格式,确认配置属性无误,以及添加正确的数据库驱动依赖。利用日志记录和异常信息分析可辅助问题排查。
302 10
|
2月前
|
Java 关系型数据库 MySQL
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第4天】本文分析了Spring Boot应用在连接数据库时可能遇到的问题及其解决方案。主要从四个方面探讨:配置文件格式错误、依赖缺失或版本不兼容、数据库服务问题、配置属性未正确注入。针对这些问题,提供了详细的检查方法和调试技巧,如检查YAML格式、验证依赖版本、确认数据库服务状态及用户权限,并通过日志和断点调试定位问题。
154 6
|
2月前
|
Oracle Java 关系型数据库
使用DataGrip链接达梦数据库
使用DataGrip链接达梦数据库
166 0
|
4月前
|
存储 测试技术 数据处理
【计算机三级数据库技术】第2章 信息系统需求分析完整知识体系--附思维导图
本文详细介绍了信息系统需求分析的知识体系,包括需求分析的概念和意义、需求获取的方法、需求分析的过程,以及需求分析方法,如DFD数据流图、IDEF0、UML等。文章通过结构化分析和功能建模方法,帮助读者理解如何标识问题、建立需求模型、描述和确认需求,并比较了DFD与IDEF0两种方法的异同,同时提供了思维导图以辅助理解。
88 12
|
4月前
|
存储 监控 安全
【计算机三级数据库技术】第1章 数据库应用系统生命周期下知识体系--附思维导图
本文提供了数据库应用系统生命周期下的知识体系概述,并附有思维导图,帮助读者更好地理解数据库技术及应用的第一章内容,涵盖了数据库系统的规划、分析、设计、实现、测试、运行和维护等各个阶段。
72 12
|
4月前
|
监控 数据可视化 前端开发
基于python django生产数据与计划大屏,可链接数据库
本文介绍了一个基于Python Django框架开发的生产数据与计划大屏系统,该系统能够实时采集和展示生产数据,支持数据可视化和实时更新,以提高生产监控的效率和质量。
|
4月前
|
SQL 数据库
【计算机三级数据库技术】第6章 高级数据查询--附思维导图
提供了SQL查询的高级概念和应用,包括一般数据查询(如使用TOP、CASE和INTO关键字)、查询结构的并、交、差运算(UNION、INTERSECT、EXCEPT),相关子查询,替代子查询和派生表,以及开窗函数和公用表表达式(CTE)。文中还包含了思维导图,帮助读者更好地理解SELECT单表查询语句的要点。
50 4