關(guān)于 sql server 數(shù)據(jù)庫(kù)查詢數(shù)據(jù)或執(zhí)行存儲(chǔ)過(guò)程時(shí),出現(xiàn)類似 "沒(méi)有dbo權(quán)限"、"找不到 dbo.XXX 對(duì)象"等的解決方法
1. 出現(xiàn)這個(gè)問(wèn)題的原因是因?yàn)楫?dāng)前連接數(shù)據(jù)庫(kù)的登錄用戶不是 dbo 權(quán)限,所以此用戶不能操作所有者為 dbo 的對(duì)象。為什么不開(kāi)放 dbo 權(quán)限:因?yàn)槿绻蛻舻某绦蛴袉?wèn)題(比如有注入漏洞)、或數(shù)據(jù)庫(kù)密碼泄漏等,如果當(dāng)前用戶有 dbo 權(quán)限的話,會(huì)給數(shù)據(jù)庫(kù)服務(wù)器帶來(lái)安全隱患,所以我司的數(shù)據(jù)庫(kù)都不開(kāi)放 dbo 權(quán)限,而我們給用戶開(kāi)放了datareader、datawriter、ddladmin 等權(quán)限,這些權(quán)限一般情況下是足夠的。
2. 用戶在初始化數(shù)據(jù)的時(shí)候,比如通過(guò)企業(yè)管理器執(zhí)行導(dǎo)入數(shù)據(jù)的 SQL ,或通過(guò)某些網(wǎng)站安裝程序初始化的時(shí)候,這些原始的初始化數(shù)據(jù)中的對(duì)象所有者可能是 dbo ,這將會(huì)導(dǎo)致在初始化數(shù)據(jù)后,數(shù)據(jù)庫(kù)的當(dāng)前登錄用戶沒(méi)有權(quán)限操作這些對(duì)象。
3. 對(duì)于以上問(wèn)題,解決方法如下:
1. 在您對(duì)數(shù)據(jù)庫(kù)的結(jié)構(gòu)進(jìn)行了更改后,要注意數(shù)據(jù)庫(kù)對(duì)象(如數(shù)據(jù)表、存儲(chǔ)過(guò)程等)的所有者應(yīng)該是您的數(shù)據(jù)庫(kù)用戶名,而不是 dbo ,如果您發(fā)現(xiàn)有某些對(duì)象的所有者是 dbo ,這時(shí)您應(yīng)該登錄我司的數(shù)據(jù)庫(kù)控制面板,然后找到“修復(fù)對(duì)象所有者”的按鈕,點(diǎn)擊一下就可以將所有對(duì)象的所有者設(shè)置為您的當(dāng)前登錄用戶。
(注意:系統(tǒng)表、系統(tǒng)存儲(chǔ)過(guò)程 等不用處理,只有自己建立的表、存儲(chǔ)過(guò)程、視圖等才要處理)
4. 在您的程序中,要注意以下方面
在查詢、更新、刪除數(shù)據(jù),執(zhí)行存儲(chǔ)過(guò)程等一切操作中,不要使用 "dbo.表名"、"dbo.存儲(chǔ)過(guò)程名" 等進(jìn)行操作,
而改為直接用 "表名"、"存儲(chǔ)過(guò)程"名等進(jìn)行操作,就是不要帶有對(duì)象所有者的部分,如:
select * from dbo.table1 應(yīng)該改為 select * from table1
更多請(qǐng)做類似修改~