Skip to main content
 首页 » 网络日志

Microsoft OLE DB Provider for SQL Server 错误 '80040e37' 对象名无效的解决方法

6年前 (2015-06-07)39631

MSSQL数据库从一台服务器转移到另一台服务器后,发现一直会出现一个错误:

 
Microsoft OLE DB Provider for SQL Server 错误 '80040e37'
对象名 '出错的对象名'  无效。
 
先查看了一下数据库表,确实有这个表存在,而且程序中调用语句也没错。重写了一下代码,结果一样,怀疑不是程序的问题,于是查看其它页面发现所有的页面只要有调用到数据库的地方,都会出现错误。
 
判断是数据库出现了问题,数据库链接没错,导入也没错。
最后找到如下方法解决:
原因是把所有以前的所有者改为DBO就不会出问题了。
下面是各种把sql server 2000的用户表的所有者改成dbo方法的详细说明:
 
方法一:右键点击该表-》设计表,在上面的一排小图标中,点最后一个"条件约束",点"表"页,在里面更改所有者。(若没有条件约束的小图标,可以点右键,能看到一个"check约束"的选项)
 
执行下面语句可以把当前库的所有表的所有者改为dbo 
exec sp_msforeachtable "sp_changeobjectowner '?','dbo'"
--如果是要用户表/存储过程/视图/触发器/自定义函数一齐改,则用游标(不要理会错误提示) 
declare tb cursor local for 
select 'sp_changeobjectowner ''['+replace(user_name(uid),']',']]')+'].[' 
+replace(name,']',']]')+']'',''dbo''' 
from sysobjects 
where xtype in('U','V','P','TR','FN','IF','TF') and status>=0 
open tb 
declare @s nvarchar(4000) 
fetch tb into @s 
while @@fetch_status=0 
begin 
exec(@s) 
fetch tb into @s 
end 
close tb 
deallocate tb 
go
存储过程 ChangeObjectOwner
 
--功能说明:成批更改数据库所有者的对象 
--作者:不详 
--用法:exec ChangeObjectOwner 'nmkspro','dbo' 
--即可将所有nmkspro所有者的对象改为dbo所有 
--运行成功后将提示:"注意: 更改对象名的任一部分都可能破坏脚本和存储过程。" 
CREATE PROCEDURE dbo.ChangeObjectOwner 
@OldOwner as NVARCHAR(128),--参数原所有者 
@NewOwner as NVARCHAR(128)--参数新所有者 
AS
 
DECLARE @Name as NVARCHAR(128) 
DECLARE @Owner as NVARCHAR(128) 
DECLARE @OwnerName as NVARCHAR(128)
 
DECLARE curObject CURSOR FOR 
select 'Name' = name, 
'Owner' = user_name(uid) 
from sysobjects 
where user_name(uid)=@OldOwner 
order by name
 
OPEN curObject 
FETCH NEXT FROM curObject INTO @Name, @Owner 
WHILE(@@FETCH_STATUS=0) 
BEGIN 
if @Owner=@OldOwner 
begin 
set @OwnerName = @OldOwner + '.' + rtrim(@Name) 
exec sp_changeobjectowner @OwnerName, @NewOwner 
end
 
FETCH NEXT FROM curObject INTO @Name, @Owner 
END
 
close curObject 
deallocate curObject 
GO
方法二:利用脚本直接执行,用系统帐号或者超户登陆到该数据库,然后执行下面语句:
sp_configure 'allow updates','1' 
go 
reconfigure with override 
go 
update sysobjects set uid=1 where uid<>1 
go 
sp_configure 'allow updates','0' 
go 
reconfigure with override
第二种方法只能使用一次,第二次使用会出错。

 

评论列表1条评论
跨境电商运营
跨境电商运营回复 作为新手看这个文章非常的有用啊。。。
发表评论
新浪微博
微信