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