使用sqlserver數據庫時(shí),產(chǎn)生SQL對象名無(wú)效的問(wèn)題一般是以下兩種常見(jiàn)原因,下面根據不同的原因給出解決方法。
原因一:新建的數據庫,沒(méi)有將初始數據導入到新庫里。
解決方法:請登錄到我司數據庫控制面板->備份還原系統,然后使用數據庫還原的功能,在那里直接將您的數據庫備份上傳還原,如果操作過(guò)程沒(méi)有出現錯誤,一般您的數據庫就已經(jīng)還原了,此方法適合還原一些初始數據不是很大的數據庫(30M以?xún)?,如果您的數據庫初始數據很大,在線(xiàn)上傳還原的成功率比較低,這時(shí)請使用數據庫導入導出的方法進(jìn)行還原,詳細的導入導出方法請查看我司的另一篇幫助文檔 數據庫導入導出方法詳解
原因二:數據庫做過(guò)遷移,新數據庫的對象所有者名稱(chēng)不同造成
數據庫做了遷移后,一般會(huì )進(jìn)行導入/還原數據的過(guò)程,在這個(gè)過(guò)程中,要注意新數據庫的完整對象名與原來(lái)是一致的。
比如,您的舊數據庫名叫 db1 , 舊數據庫用戶(hù)是 dbuser1, 現在要遷移到新的數據庫上,新數據庫名是 db2, 新數據庫用戶(hù)是 dbuser2。
sqlserver對象的完整對象名是 數據庫名.用戶(hù)名.表名 這樣的,假設你的舊數據庫上有個(gè)表名叫 table1,那它的完整對象名就是 db1.dbuser1.table1,
當你用新的數據庫名登錄導入舊數據時(shí),新的表名可能變成了 db2.dbuser2.table1,這樣的話(huà),您的程序查詢(xún)數據時(shí)可能會(huì )出現對象名無(wú)效的錯誤。
解決方法:要解決這個(gè)問(wèn)題,一般需要做兩步操作:
1. 請分別使用 sp_changeobjectowner '這里改為數據庫完整對象名','dbo' 這個(gè)命令將所有的用戶(hù)表,用戶(hù)視圖,用戶(hù)存儲過(guò)程等的所有者全部改為系統內建的特殊用戶(hù)dbo
以下是一個(gè)可以簡(jiǎn)化執行上面操作的存儲過(guò)程,以下存儲過(guò)程運行后可能還會(huì )有部分的對象改不到所有者,這時(shí)請手動(dòng)執行上面的命令將未能改所有者的對象重新嘗試一下。
declare @CrsrVar cursor
declare @pname? varchar(40) --對象名
declare @oldowner varchar(40) --原對象所有者
declare @objfullname varchar(80) --原對象全名
set @oldowner = '這里改為數據表/視圖/存儲過(guò)程等的舊所有者名稱(chēng)'
set?? @CrsrVar = Cursor For select name from sysobjects where xtype='U' --xtype=U 表示用戶(hù)表
open? @CrsrVar
fetch next from @CrsrVar into @pname
while(@@fetch_status=0)
begin
?set @objfullname? = @oldowner + '.' + @pname
?exec sp_changeobjectowner @objname=@objfullname,@newowner='dbo'? --dbo為所有者名
?fetch next from @CrsrVar into @pname
end
close?? @CrsrVar
deallocate?? @CrsrVar
2. 可能您的編寫(xiě)網(wǎng)站程序的時(shí)候沒(méi)有注意通用性,在查詢(xún)數據時(shí)采用了類(lèi)似 select * from dbuser1.table1?這樣的SQL語(yǔ)句,一般來(lái)說(shuō),這不是一個(gè)好的習慣,在這種情況下,如果數據庫遷移過(guò)的話(huà),經(jīng)常會(huì )導致對象名無(wú)效的錯誤,為了避免這種不必要的問(wèn)題,建議您在程序中查詢(xún)數據時(shí),直接用 select * from table1 這樣的方式,就是在程序中不在用對象的完整名稱(chēng),而是單使用表名或視圖名,這樣就可以避免不必要的“對象名無(wú)效”的問(wèn)題。