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

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

  前几天给开发部门部署测试数据库时,遇到一个很诡异的问题:创建一个链接服务器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
相关文章
|
4月前
|
SQL Java 数据库连接
java链接hive数据库实现增删改查操作
java链接hive数据库实现增删改查操作
160 0
|
2月前
|
druid Java 数据库
druid+springboot加解密Druid链接池配置加密密码链接数据库
druid+springboot加解密Druid链接池配置加密密码链接数据库
87 0
|
1月前
|
关系型数据库 数据库 C++
【C++】Windows使用Visual Studio C++链接云数据库PostgreSQL(沉浸式老爷教学)
【C++】Windows使用Visual Studio C++链接云数据库PostgreSQL(沉浸式老爷教学)
|
4月前
|
关系型数据库 MySQL PHP
|
4天前
|
Java 关系型数据库 MySQL
【JAVA进阶篇教学】第八篇:Java链接MySql数据库异常
【JAVA进阶篇教学】第八篇:Java链接MySql数据库异常
|
4月前
|
SQL 关系型数据库 MySQL
常用的数据库链接工具都有哪些
常用的数据库链接工具都有哪些
180 2
|
2月前
|
存储 SQL 关系型数据库
计算机的数据库
计算机的数据库
15 2
|
6月前
|
数据库 数据安全/隐私保护
navicat 链接不上别人数据库
navicat 链接不上别人数据库
42 0
|
6月前
|
Oracle NoSQL 关系型数据库
navicat链接数据库
navicat链接数据库
31 0
|
2月前
|
SQL JavaScript 关系型数据库
js链接sql数据库
js链接sql数据库