2009-07-16 1434 views
31

我有一個數據庫,並有一個SQL腳本來添加一些名爲數據庫的「產品」表中的字段。無法找到該對象,因爲它不存在或您沒有權限,SQL Server中的錯誤

但是當我執行這個腳本,我收到以下錯誤:

Cannot find the object "Products" because it does not exist or you do not have permissions 

它爲什麼發生錯誤,我應該怎麼做才能解決這個問題?

+0

這是*** sql腳本***? – Kiquenet 2016-08-16 11:28:11

+0

這可能與權限有關。用戶是否是db_owner角色的成員? – Tarzan 2017-06-26 19:46:52

回答

54

您確定您正在對正確的數據庫執行腳本嗎?在SQL Server Management Studio中你可以改變你的其中一個工具欄運行查詢針對一個下拉框的數據庫,或者你可以用這個開始查詢:

USE SomeDatabase 
5

請問你是用戶在甚至看到那個表之後執行這個腳本?

select top 1 * from products 

你會得到任何輸出?

如果是:該用戶是否有權修改該表,即執行DDL腳本如ALTER TABLE等?通常,普通用戶沒有這個提升的權限。

1

您可以右鍵單擊該過程,選擇屬性並查看授予您的登錄ID的權限。然後您可以手動檢查「執行」並更改proc權限。

或者腳本這將是:

GRANT EXECUTE ON OBJECT::dbo.[PROCNAME] 
    TO [ServerInstance\user]; 

GRANT ALTER ON OBJECT::dbo.[PROCNAME] 
    TO [ServerInstance\user]; 
+0

該過程正在運行......問題是訪問表,而不是過程。 – 2016-12-21 20:36:50

46

我找了個理由,爲什麼會發生這種事。用戶有相應的權限,但存儲過程包括了TRUNCATE聲明:

TRUNCATE表名

由於TRUNCATE不刪除記錄的項目,你(顯然)需要提升的權限執行包含它的存儲過程。我們改變了語句:

DELETE FROM表名

...和錯誤走了!

+1

truncate語句對我來說也是一個問題。爲truncate添加適當的權限修復了它。 – Andrew 2013-08-16 16:50:20

2

它也可能是可能是您在登錄模式中創建的「產品」,您試圖執行相同的不同的模式(可能DBO)

步驟來解決此問題

1)打開管理工作室 2)在資源管理器中找到對象並確定對象所在的模式? (這是你的對象名稱之前的文本)。在低於其在「DBO」和我對象名字的圖像是動作狀態

highlighted part is schema name

,如果你看它像「yourcompanydoamin \ yourloginid」,那麼你應該 您可以修改該特定架構的權限,而不是任何其他架構。

您可以參考"Ownership and User-Schema Separation in SQL Server"

2

它也有可能發生因錯字在引用表如[dbo.Product]而不是[dbo].[Product]

0

在我的情況下,我在一個不同的用戶下運行,而不是我期望的用戶。

我已將'DRIVER={SQL Server};SERVER=...;DATABASE=...;Trusted_Connection=false;User Id=XXX;Password=YYY'作爲連接字符串傳遞給pypyodbc.connect(),但連接仍使用運行該腳本的Windows用戶的憑據(我使用SQL Server Profiler驗證了這一點,並嘗試使用無效的uid /密碼組合 - 這不會導致預期的錯誤)。

我決定不進一步挖掘到這一點,因爲切換到的連接固定的問題,這更好的辦法:

conn = pypyodbc.connect(driver='{SQL Server}', server='servername', database='dbname', uid='userName', pwd='Password') 
0

我一直在試圖將表從PROD複製到DEV但得到一個錯誤: 「找不到對象X,因爲它不存在或者您沒有權限。」

但是,該表確實存在,並且我正在運行,所以我確實擁有權限。

問題實際上是與禁忌症。我將DEV上的表格重新命名爲old_XXX個月前。但是當我試圖從PROD複製原來的一個時,Defaut Constraint名稱就發生了衝突。

錯誤消息是誤導