Share via


疑難排解資料庫專案、建置和部署的問題

更新:2007 年 11 月

當您建立、修改、建置或部署資料庫專案時,可能會遇到以下問題:

  • 建立資料庫專案時發生錯誤

  • 嘗試使用 SQL Server 2000 資料庫進行設計階段驗證時發生錯誤

  • 資料庫物件中的錯誤

  • 在 Microsoft SQL Server 2005 中使用新的保留字

  • 命令列建置的差異

  • 對稱金鑰、非對稱金鑰和憑證

  • 相依性與更新指令碼

  • 當您將自己加入為使用者時發生錯誤

  • 引號識別項可能會造成專案重新載入的問題

  • 資料庫的內部狀態與其內容不一致

  • 全文檢索

  • SQLCLR 物件

  • 復原暫止的變更

  • 找不到 Windows NT 使用者或群組

  • 複製物件名稱及排除檔案

  • CREATE ASSEMBLY 不支援參考檔案

  • 從 SQL Server 2000 轉換到 SQL Server 2005 的問題

  • 資料庫和伺服器限定名稱

  • 擴充屬性支援

  • 匯入資料庫結構描述的效能

  • 組建錯誤巡覽

  • 資料庫專案和 TRUSTWORTHY 設定

  • 連結的伺服器和匯入指令碼

  • 使用跨資料庫參考時發生語法錯誤

  • 具擴充屬性的 XML 索引

  • 使用 Team Foundation Build 的權限問題

  • 建置期間非預期的語彙基元警告

  • 從 x64 架構電腦以命令列部署至遠端資料庫伺服器失敗

建立資料庫專案時發生錯誤

如果建立資料庫專案時,您並沒有權限在進行設計階段驗證之 Microsoft SQL Server 的本機執行個體中建立資料庫,則會出現錯誤訊息。

注意事項:

使用例如 SQL Server Management Studio 的工具設定 SQL Server 執行個體的權限。如果您無法使用系統管理認證登入,您可能必須要求系統管理員授與您在 SQL Server 中建立資料庫的權限。

您必須確定針對設計階段驗證資料庫所指定的執行個體名稱正確無誤。如需詳細資訊,請參閱 HOW TO:指定用於設計階段驗證的本機 SQL Server 執行個體

如果您在沒有系統管理權限的情況下執行 Visual Studio,可能會出現「CREATE DATABASE 權限在資料庫 'master' 中遭拒」的錯誤。若要解決此錯誤,具有系統管理員 (sysadmin) 權限的使用者應該在設計階段驗證資料庫上執行下列指令碼:

USE master
GO
GRANT EXECUTE ON sp_detach_db TO public
GO

嘗試使用 SQL Server 2000 資料庫進行設計階段驗證時發生錯誤

如果您將用於設計階段驗證的資料庫變更為 SQL Server 2000 的執行個體,然後嘗試建立或修改資料庫專案,則會出現錯誤。此錯誤可能會類似於「'ENABLE BROKER' 前後的語法不正確」。設計階段驗證資料庫會使用 SQL Server 2005 的功能。

注意事項:

您必須將有效的 SQL Server 2005 資料庫執行個體指定為設計階段驗證資料庫。如需詳細資訊,請參閱 HOW TO:指定用於設計階段驗證的本機 SQL Server 執行個體

資料庫物件中的錯誤

當「資料庫物件」(Database Object) 包含一個或多個語法錯誤時,該資料庫的圖示會顯示錯誤圖示 (紅色 "!"),而且相關的錯誤訊息會出現在 [錯誤清單] 視窗中。在設計階段驗證期間,SQL Server 的本機執行個體會針對傳回的錯誤報告正確的資料列編號。但是,資料行編號一定會報告為資料行一。在 SQL 語法錯誤中,資料列和資料行都是正確的。

注意事項:

出現在 [錯誤清單] 視窗中的錯誤訊息應該會提供解決此錯誤可採取之動作的相關資訊。當您解決錯誤並儲存資料庫物件之後,該資料庫物件的圖示會回到一般狀態。

在 Microsoft SQL Server 2005 中使用新的保留字

下列是 SQL Server 2005 中的新保留關鍵字:EXTERNAL、PIVOT、REVERT、TABLESAMPLE 和 UNPIVOT。如果您在以 SQL Server 2000 為目標的資料庫專案內使用這些保留關鍵字當做結構描述物件名稱,則 [輸出] 視窗中會出現錯誤。

注意事項:

若要避開這項限制,您可以用引號括住結構描述物件名稱。例如,您可以使用 "CREATE TABLE [External] (c1 INT)"。

命令列建置的差異

如果當您在 Visual Studio 中開啟專案時執行命令列建置,您可能不會收到當您在使用者介面中建置時所收到的所有建置錯誤。

注意事項:

若要解決這個問題,請先在 Visual Studio 中關閉資料庫專案,然後再執行命令列建置。

對稱金鑰、非對稱金鑰和憑證

在 Visual Studio Team System Database 版中,您不能將對稱金鑰、非對稱金鑰或憑證建立為資料庫物件。當匯入資料庫結構描述時,會將具有金鑰和憑證名稱的預留位置註解放入到預先部署指令碼中。您必須變更預先部署指令碼,才能建立這些物件。同樣地,當您比較資料庫結構描述時,「結構描述更新指令碼」不會包含必要的 Transact-SQL (T-SQL) 命令來建立遺失的對稱金鑰、非對稱金鑰或憑證。您必須將更新指令碼匯出至編輯器,然後加入陳述式來建立這些物件。

相依性與更新指令碼

為了產生更新指令碼中物件的正確順序,「結構描述比較」會檢查物件相依性。例如,假設檢視相依於資料表,就必須先建立資料表,才能建立檢視。如果與第二個物件相依的物件未使用符合結構描述資格的名稱,則可能無法辨識相依性,而且更新或建立指令碼的陳述式順序也可能不正確。當您更新「目標」(Target) 使其與「來源」(Source) 相符,或是將變更部署至資料庫時,這樣的差異可能會產生錯誤。資料庫建置指令碼也有相同的問題。

注意事項:

若要解決此問題,請確定與相依關聯性有關的物件有使用符合結構描述資格的名稱。在下列範例中,如果將陳述式的結尾變更為參考 [dbo].[KeysTable],而不只是 KeysTable,就能確保正確辨識相依性:

CREATE VIEW [NewUser].[ViewReferencingScalarFunction] AS SELECT Column2, dbo.SimpleMultiplyParamByTwo(PK_Column) AS [Function] FROM KeysTable

當您將自己加入為使用者時發生錯誤

如果您是系統管理員 (sysadmin) 角色的成員,而且您嘗試將自己加入為使用者,則會出現下列錯誤:「登入已經具有一個不同使用者名稱之下的帳戶」。發生這個錯誤是因為您是設計階段驗證資料庫的資料庫擁有人,這表示您也是該資料庫中的使用者 dbo;因此,您不能再次將自己加入為資料庫使用者。

引號識別項可能會造成專案重新載入的問題

如果資料庫屬性中的 [SET QUOTED_IDENTIFIER] 核取方塊被清除,當您儲存物件或載入包含引號識別項的資料庫時,將出現錯誤。如果您從使用引號識別項的資料庫匯入資料庫結構描述,則可能會發生這個狀況。

注意事項:

若要解決這個問題,您有兩個選擇。您可以修改物件定義,使其使用方括弧,而不要使用引號。例如,您可以將 "My Table" 變更為 [My Table]。或者,您可以開啟 [專案] 功能表,按一下 [DatabaseProject屬性],再按 [資料庫屬性] 索引標籤,然後選取 [SET QUOTED_IDENTIFIER] 核取方塊。

資料庫的內部狀態與其內容不一致

當您使用 Database 版時,可能會收到下列錯誤:「資料庫專案的內部狀態與其內容不一致。請卸載專案然後重新載入,以解決這個問題」。這個錯誤表示此專案 (此專案會維護它認為有包含的檔案清單) 已經不再與檔案的狀態同步。您可能會遇到這個錯誤的最常見原因就是當資料庫專案未開啟時,從磁碟中刪除專案內的其中一個檔案。當您匯入資料庫結構描述時如果有發生問題,也會產生這個錯誤。

注意事項:

若要解決此問題,您必須卸載此資料庫專案,然後再重新載入。若要這樣做,請在 [方案總管] 中按一下此專案。開啟 [專案] 功能表,然後按一下 [卸載專案]。當此專案卸載之後,請開啟 [專案] 功能表,然後按一下 [重新載入專案]。

全文檢索

全文檢索搜尋及設計階段驗證資料庫

如果您在設計階段驗證資料庫中關閉全文檢索搜尋,然後從具有全文檢索索引物件的資料庫匯入結構描述,將會匯入這些物件。但是,如果有任何物件使用全文檢索索引,則 [錯誤清單] 視窗中將會出現錯誤。當您匯入這些物件,然後在設計階段驗證資料庫中關閉全文檢索搜尋之後,將會出現相同的錯誤。

注意事項:

若要解決此問題,您必須在設計階段驗證資料庫中開啟全文檢索搜尋。如需詳細資訊,請參閱 Microsoft 網站上的<全文檢索搜尋>。

全文檢索索引定義中的 sp_fulltext_table 動作

全文檢索索引的定義中只允許 CREATE 動作。如果您想要執行類似 ACTIVATE 的動作,您必須在資料庫的部署後指令碼中執行。如果您要新增其他動作,則會出現下列錯誤:主要批次不能有最上層「資料操作語言」(Data Manipulation Language,DML) 陳述式。請移除該陳述式,然後再試一次這項作業。

注意事項:

若要解決此問題,您必須將 sp_fulltext_table 陳述式移到部署後指令碼或是部署後指令碼所包含的指令碼中。如需部署後指令碼的詳細資訊,請參閱 HOW TO:指定部署前或部署後指令碼

SQLCLR 物件

根據預設,Microsoft SQL Server 2005 中會停用 SQLCLR 整合。如果您從具有 SQLCLR 物件的資料庫匯入結構描述,而且在設計階段驗證資料庫中已停用 SQLCLR 整合,[錯誤清單] 視窗中將不會出現錯誤。但是,如果您嘗試執行這些物件,將會收到錯誤。

注意事項:

若要解決此問題,您必須從 Database 版執行 Transact-SQL 編輯器、或是執行如 SQL Server Management Studio 的工具,並且以系統管理員的身分連接到伺服器。然後在查詢視窗中,執行下列程式碼:

exec sp_configure 'clr enabled', 1
reconfigure

復原暫止的變更

當您使用版本控制系統的 [復原暫止的變更] 命令之後,[結構描述檢視] 不會自動重新整理。例如,如果您將資料表或資料行重新命名,然後還原那些變更,則會在 [結構描述檢視] 中顯示「外部檔案變更,必須重新同步處理...」訊息。

注意事項:

若要解決此問題,您必須按一下 [結構描述檢視] 工具列上的 [同步處理]。

找不到 Windows NT 使用者或群組

如果資料庫專案參考到一個無法使用的登入帳戶,則會出現「找不到 Windows NT 使用者或群組 'DomainName\LoginName'。請再一次檢查名稱」錯誤。例如,當使用之電腦所在的網域與匯入結構描述所屬的資料庫不同時,可能會遇到這個問題。如果您在家中使用其他地方所建立的資料庫專案,通常會發生這個狀況。在此狀況下,您將無法建置或部署資料庫專案。

注意事項:

這個問題沒有解決方法。只有在參考的登入有效時,才能建置及部署資料庫專案。

複製物件名稱及排除檔案

如果您在資料庫專案中有重複的物件名稱 (例如,有兩個資料表命名為 Orders),則 [錯誤清單] 視窗中會出現錯誤。即使當您排除包含其中一個物件之定義的檔案來解決此問題時,這個錯誤訊息也不會立刻消失。

注意事項:

若要解決此問題,您可以按一下 [重新整理],也可以編輯包含物件定義的檔案,並重新命名此物件,然後再儲存檔案。

CREATE ASSEMBLY 不支援參考檔案

您可以透過在陳述式中加入二進位程式碼或指定組件 (Assembly) 的檔案路徑,將 CLR 組件加入至 Transact-SQL (T-SQL) CREATE ASSEMBLY 陳述式。Database 版不支援後面的方法。如果您嘗試使用這個語法,則會出現下列錯誤:CREATE ASSEMBLY 只能在它的 FROM 子句中有二進位項目。

注意事項:

這個問題沒有解決方法。

從 SQL Server 2000 轉換到 SQL Server 2005 的問題

當您將資料庫專案從 SQL Server 2000 轉換到 SQL Server 2005 時,SQL Server 2005 物件的內容功能表不會出現在 [結構描述檢視] 中。

注意事項:

若要解決此問題,請在您將資料庫專案轉換成 SQL Server 2005 之後,將它關閉並重新開啟。

資料庫限定和伺服器限定名稱

當您在 Team Edition for Database Professionals 中建立物件時,會根據 [schema].[object].[child] 命名規範來命名物件。如果想要參考其他資料庫或其他伺服器的物件,您可以這個方式包含資料庫和伺服器的名稱:[server].[database].[schema].[object].[child]。如果您所建立的預存程序或檢視表會參考需要資料庫限定或伺服器限定名稱的物件,則會出現警告。

注意事項:

若要解決這個警告,必須定義跨資料庫參考。如需跨資料庫參考的詳細資訊,請參閱跨資料庫參考的概觀HOW TO:建立跨資料庫參考

重要事項:

如果專案具有資料庫限定或伺服器限定名稱的相關未解決警告,而且您在資料庫專案屬性的 [建置] 索引標籤上選取 [警告視為錯誤] 核取方塊,則部署將會失敗。產生這個失敗是因為資料庫限定或伺服器限定的名稱會產生警告。如果您要使用資料庫限定或伺服器限定的名稱,必須清除 [警告視為錯誤] 核取方塊。

擴充屬性支援

這個版本的 Database 版不支援檔案群組、檔案名稱和函式條件約束上的擴充屬性。當您匯入資料庫結構描述或指令碼時,會略過這些物件型別上的擴充屬性。

此外,儲存 TinyInt、SmallInt、UniqueIdentifier 或位元值的擴充屬性也會略過,並將其放到 ScriptsIgnoredOnImport.sql 檔中。

注意事項:

若要解決此問題,您必須在部署後指令碼中手動建立擴充屬性。如需詳細資訊,請參閱 HOW TO:指定部署前或部署後指令碼

匯入資料庫結構描述的效能

如果您在 [測試清單編輯器] 視窗或 [測試檢視] 視窗開啟時匯入資料庫結構描述,匯入作業將需要較長的時間完成。這種變慢的情況將同時會發生在 [新增資料庫專案精靈] 中 (如果選擇匯入資料庫結構描述) 及匯入資料庫結構描述作業期間。即使在匯入資料庫結構描述之前關閉 [測試清單編輯器] 和 [測試檢視] 視窗,這個問題也會發生。

注意事項:

若要解決這個問題,您必須關閉 [測試清單編輯器] 和 [測試檢視] 視窗,關閉後重新啟動 Visual Studio,然後再匯入資料庫結構描述。針對較小的結構描述,您可能不需要執行這些步驟。以 AdventureWorks 範例資料庫為例,在未開啟 [測試清單編輯器] 視窗的情況下,匯入結構描述作業需要 27 秒,而在開啟 [測試清單編輯器] 視窗的情況下,則需要 48 秒。

組建錯誤巡覽

如果部署失敗,您便無法透過更新已產生的組建指令碼來更正錯誤。您必須更正用以產生該組建指令碼的原始程式檔 (Source File)。如果您按兩下 [錯誤清單] 視窗中的部署錯誤,組建指令碼便會出現在編輯器中,並且顯示造成錯誤的指令碼行。

注意事項:

若要解決這個問題,您必須檢視組建指令碼,以判斷失敗的原因,然後必須在資料庫專案中修改含有錯誤的原始程式檔。例如,如果部署後指令碼 Permissions.sql 含有錯誤,您必須修改 Permissions.sql,而非修改組建指令碼。

資料庫專案和 TRUSTWORTHY 設定

您必須擁有系統管理員 (sysadmin) 的權限,才能啟用資料庫專案的 TRUSTWORTHY 設定,或開啟已啟用 TRUSTWORTHY 設定的資料庫專案。

注意事項:

若要解決這個問題,如果不應該啟用 TRUSTWORTHY 設定,則請您的系統管理員停用資料庫專案的設定。如果必須啟用 TRUSTWORTHY 設定,那麼所有參與資料庫專案的開發人員都必須獲得該資料庫的系統管理員 (sysadmin) 權限。如果每一個開發人員是在隔離的開發環境中工作,而且每一個人都擁有私用的資料庫複本,則可以安全地將每一個人加入該資料庫的系統管理員 (sysadmin) 角色。

連結的伺服器和匯入指令碼

如果已在資料庫專案中匯入多個指令碼,在部署資料庫時您可能會收到錯誤。如果在那些指令碼之間,同一個連結的伺服器被定義一次以上,便會發生這個狀況。

注意事項:

若要解決這個問題,您可以在 LinkedServers.sql 預先部署指令碼中的每一個 sp_addlinkedserver 呼叫之前,加入下列 T-SQL:

IF NOT EXISTS (SELECT * FROM master.dbo.sysservers WHERE srvname = N'<serverName>')

使用跨資料庫參考時發生語法錯誤

當您儲存的物件定義中包含其他資料庫中物件的參考時,您可能會收到一個或多個語法錯誤。例如,您可以加入資料庫專案的參考、定義名為 RefServer 和 RefDatabase 的變數,並指派這些變數的值。接著,您可能會定義檢視,如下所示:

CREATE VIEW [dbo].[MyView]
AS
SELECT * FROM $(RefServer).$(RefDatabase).dbo.TableName

當您儲存這個定義時,您可能會收到一個或多個指出語法錯誤的錯誤訊息。這些錯誤訊息可能會參考您的設計階段驗證資料庫的名稱,而可能造成混淆。

注意事項:

為了解決這個問題,您必須將變數名稱括在方括弧中。若要更正此範例,請將它變更如下:

CREATE VIEW [dbo].[MyView]
AS
SELECT * FROM [$(RefServer)].[$(RefDatabase)].dbo.TableName

具擴充屬性的 XML 索引

儲存 XML 索引的物件定義時,如果 XML 索引包含一個或多個的擴充屬性定義,則可能會出現一個或多個語法錯誤。發生這類錯誤的原因是在卸除和重新建立 XML 索引時,SQL Server 2005 不會移除擴充屬性。這種情況發生時,可能會出現下列錯誤:「TSD4001:無法加入屬性。'XMLIndexName' 的屬性 'ExtendedPropertyName' 已經存在 (SQL 錯誤 = 15233)」。

注意事項:

若要解決這個問題,必須將擴充屬性定義移至部署後指令碼,並緊接著定義前加入下列陳述式:

IF NOT EXISTS (SELECT * FROM fn_listextendedproperty('ExtendedPropertyName', 'SCHEMA', N'SchemaName', 'TABLE', N'TableName', 'INDEX', N'XMLIndexName')

使用 Team Foundation Build 的權限問題

當您使用 Team Foundation Build 建置與部署資料庫專案時,可能會接收到權限錯誤。根據預設,Team Foundation Build 的服務帳戶會使用網路服務帳戶。網路服務帳戶在組建電腦上沒有 SQL Server 執行個體所需的權限。

注意事項:

若要解決這個問題,您必須將其他權限授與網路服務帳戶,或將執行 Team Foundation Build 所使用之服務帳戶變更為有所需之權限的帳戶。如需詳細資訊,請參閱Data Edition 中的必要權限

建置期間非預期的語彙基元警告

非預期的語彙基元警告可能會在您使用 MSBuild 建置資料庫專案時出現。如果您覆寫 DefaultDataPath 且未指定兩個後置的反斜線,則 \" 序列會解譯為引號的逸出。您將收到建置警告,而且產生的建置指令碼可能會不完整。

注意事項:

若要解決此問題,您必須在路徑尾端指定雙反斜線。如需詳細資訊,請參閱資料庫建置與部署概觀

從 x64 架構電腦以命令列部署至遠端資料庫伺服器失敗

如果未明確指定資料庫專案的目標連接,則檔案群組和檔案位置值會根據本機 x64 架構電腦上的目錄結構來設定。除非遠端資料庫伺服器也是執行 x64 作業系統和 32 位元版本的 SQL Server,否則部署便會失敗。

注意事項:

若要解決這個問題,在部署資料庫之前,您必須在資料庫專案的屬性中明確指定目標資料庫連接。如需詳細資訊,請參閱 HOW TO:設定資料庫專案進行建置和部署

請參閱

工作

HOW TO:修改資料庫物件

HOW TO:檢視資料差異

概念

Database Edition 的用語概觀

其他資源

重新命名資料庫物件