昨天我在给公司的某个SQL2005做转移的过程中遇到此问题,到时为了方便,转移方法直接采用的,停止A服务器,复制A服务器中的数据库,将此数据库加载到B服务器,重启B服务器,有可能这种迁移方法有问题,最后的结果就是,可以正常远程连接数据库,但是当执行rs.update的时候会报错,一般会出现以下现象:
现象一:
Microsoft OLE DB Provider for ODBC Drivers 错误 '80004005'
[Microsoft][ODBC SQL Server Driver][SQL Server]在 sys.servers 中找不到服务器 'XXX'。请验证指定的服务器名称是否正确。如果需要,请执行存储过程 sp_addlinkedserver 以将服务器添加到 sys.servers。
/fcj/inc/sql.asp,行 186
现象二:
Microsoft OLE DB Provider for ODBC Drivers 错误 '80004005'
[Microsoft][ODBC SQL Server Driver][SQL Server]未将服务器 'XXX' 配置为用于 DATA ACCESS。
/fcj/inc/sql.asp,行 186
现象三:
[Microsoft][ODBC SQL Server Driver][SQL Server]此游标不包括正在修改的表,或该表不能通过此游标更新。
后来在网上查找原因,说是这个问题一般存在于sql2005更换服务器后。直接复制的数据库物理文件最多。内部的主机名变更导致。
解决办法:
如果是直接更换的服务器,那么主机名更换了,以前存在数据库的主机名也需要删除。进入SQL2005查询器
执行:
select @@Servername
可以看到现在默认的主机名,如果与现在的主机名不一样,说明主机名更换了
sp_helpserver
可以看到以前的主机名信息。同时可以看到所有的 SQL Server 实例
删除命令:
sp_dropserver @server='以前的主机名'
添加新主机,假设我现在的主机名是A
sp_addserver @server='A',@local=local
这时候会报错:
Microsoft OLE DB Provider for ODBC Drivers 错误 '80004005'
[Microsoft][ODBC SQL Server Driver][SQL Server]未将服务器 'A' 配置为用于 DATA ACCESS。
/fcj/inc/sql.asp,行 186
设置模式:
USE master
EXEC sp_serveroption 'A', 'data access', 'on'
可能会遇到:
[Microsoft][ODBC SQL Server Driver][SQL Server]此游标不包括正在修改的表,或该表不能通过此游标更新。
一般重新启动sql2005服务(或重启服务器),问题解决。
但是我的重启后依旧没有解决问题,于是我做了以下探索:
select @@Servername
返回值是null,这个时候当我执行
EXEC sp_dropserver @@servername
就报错说主机名null不存在
于是我直接sp_helpserver 看到了所有的SQL实例,然后删除了所有的实例(A、B、C),依次执行以下命令
EXEC sp_dropserver “A”
EXEC sp_dropserver “B”
EXEC sp_dropserver “C”
接着添加新的主机名:
EXEC sp_addserver "newSQL2005",local
设置模式:
USE MASTER;
GO
EXEC sp_serveroption 'newSQL2005','data access','on';
GO
重启SQL服务器:打开SQL2005外围应用配置器—>服务和连接的外围应用配置器,选择MSSQLSERVER,点击停止—>启动。
问题得以解决!
摘录自:SQL Server 联机丛书
1.sp_dropserver
从本地 SQL Server 实例中的已知远程服务器和链接服务器的列表中删除服务器。
语法 sp_dropserver [ @server = ] 'server' [ , [ @droplogins = ] { 'droplogins' | NULL} ]
接服务器之前必须删除登录名。若要在删除服务器时删除服务器的所有远程服务器和链接服务器登录名,请使用 droplogins 参数。
参数
[ @server = ] 'server'
要删除的服务器。server 的数据类型为 sysname,无默认值。server 必须存在。
[ @droplogins = ] 'droplogins' | NULL
指示如果指定了 droplogins,那么对于 server,还必须删除相关的远程服务器和链接服务器登录名。@droplogins 的数据类型为 char(10
),默认值为 NULL。
返回代码值 0(成功)或 1(失败)
权限 需要对服务器具有 ALTER ANY LINKED SERVER 权限。
2.sp_addserver
定义远程服务器或本地 SQL Server 实例的名称。
语法 sp_addserver [ @server = ] 'server' [ , [ @local= ] 'local' ] [ , [ @duplicate_ok = ] 'duplicate_OK' ]
备注
若要在运行早期版本的 SQL Server 的远程服务器上执行存储过程(远程过程调用),请使用sp_addserver 添加远程服务器。若要在运
行 SQL Server 7.0 版或更高版本的远程服务器上执行存储过程或任何分布式查询,请使用sp_addlinkedserver 添加服务器。
若要设置或清除服务器选项,请使用 sp_serveroption。
在用户定义的事务内不能使用 sp_addserver。
参数
[ @server = ] 'server'
服务器的名称。服务器名称必须唯一且必须符合 Microsoft Windows 计算机名称的规则,但不允许包含空格。server 的数据类型为 sysname
,无默认值。
如果计算机上安装了多个 SQL Server 实例,则实例将如同在一个独立服务器上运行。通过以下格式引用 server 来指定命名实例:
servername/instancename。
[ @local = ] 'LOCAL'
指定要添加的服务器是本地服务器还是远程服务器。@local 的数据类型为 varchar(10),默认值为NULL。将 @local 指定为 LOCAL 会将
@server 定义为本地服务器的名称,并使 @@SERVERNAME 函数返回 server 的值。
SQL Server 安装程序会在安装过程中将此变量设置为计算机名称。建议您不要更改该名称。默认情况下,用户可通过计算机名连接到 SQL
Server 的实例而无需额外的配置。
只有将服务器关闭然后重新启动后,本地的定义才会生效。每个服务器中只能定义一个本地服务器.
[ @duplicate_ok = ] 'duplicate_OK'
指定是否允许重复的服务器名。@duplicate_OK 的数据类型为 varchar(13),默认值为NULL。@duplicate_OK 只能有 duplicate_OK 或 NULL
这两个值。如果指定了 duplicate_OK 且要添加的服务器名称已经存在,则不会发生错误。如果未使用命名参数,则必须指定 @local。
返回代码值: 0(成功)或 1(失败)
权限: 要求具有 setupadmin 固定服务器角色的成员身份。