2014-01-28 53 views
12

有人請向我解釋SQL Server如何使用點符號來識別
表的位置?我一直認爲,該位置是Database.dbo.Table
但我看到有東西代替dbo別的,像代碼:
DBName.something.Table 可有人請解釋一下嗎?SQL點符號

+7

'dbo'只是一個架構,即數據庫所有者擁有的默認架構。您可以在同一個數據庫中創建額外的模式。因此,您可以獲得[linked_server]。[database]。[schema]。[object]其中對象可以是表,視圖,函數,存儲過程等。 – MatBailie

+0

更多信息請訪問:http://stackoverflow.com/questions/1062075/why-do-table-names-in-sql-server-start-with-dbo – JohnLBevan

+0

僅供參考:我個人只使用默認的dbo模式;我可能想區分表的唯一原因是將配置和安全設置中的業務數據分離,以使刷新更清晰;但後來我可能會使用多個數據庫,因爲我可能對配置和數據擁有不同的權限。 – JohnLBevan

回答

26

這是一個數據庫模式。表的全部三個部分的名稱是:

databasename.schemaname.tablename 

對於用戶的默認模式,你也可以省略架構名稱:

databasename..tablename 

您還可以指定鏈接服務器名稱:

servername.databasename.schemaname.tablename 

你可以閱讀更多有關使用上MSDN標識符作爲表名:

服務器,數據庫和所有者名稱被稱爲對象名稱的限定符。當你引用一個對象時,你不必指定服務器,數據庫和所有者。通過用一段時間標記他們的位置可以省略限定符。對象名稱有效形式包括以下內容:

server_name.database_name.schema_name.object_name

server_name.database_name..object_name

server_name..schema_name.object_name

服務器名稱... OBJECT_NAME

database_name.schema_name.object_name

database_name..object_n AME

schema_name.object_name

OBJECT_NAME

,指定所有四個部分被稱爲一個完全合格的名稱的對象名。在Microsoft SQL Server中創建的每個對象都必須具有唯一的完全限定名稱。例如,如果它們擁有不同的所有者,則可以在同一個數據庫中有兩個名爲xyz的表。

大多數對象引用使用三部分名稱。默認的server_name是本地服務器。默認的database_name是連接的當前數據庫。默認的schema_name是提交語句的用戶的默認模式。除非另行配置,否則新用戶的默認模式是dbo模式。

4

@Szymon說了什麼。您還應該總是提出模式限定對象引用(無論表,視圖,存儲過程等)。)未限定的對象引用解決以下方式:

  • 探頭當前數據庫中屬於當前連接在其下運行的憑據的默認架構指定名稱的對象的命名空間。

  • 如果未找到,請探測當前數據庫的名稱空間,以查找屬於dbo模式的指定名稱的對象。

而如果對象引用是名稱以sp_,它的更壞,因爲兩個步驟被添加到解析過程的存儲過程(除非引用是數據庫修飾):上述兩個步驟重複,但是這次,查看數據庫master而不是當前數據庫。

所以像

select * 
from foo 

查詢需要命名的兩個探頭來解決foo(假設表/視圖實際上是dbo.foo):首先你的默認架構(john_doe.foo)下,然後,沒被發現下dbodbo.foo「),而

select * 
from dbo.foo 

立即與命名空間的單個探針解決。

這具有3個含義:

  1. 冗餘的查找是昂貴的。

  2. 它抑制查詢計劃緩存,因爲每個執行必須被重新評估,這意味着查詢必須被重新編譯爲每個執行(和取出編譯時鎖)。

  3. 你會在某一點或另一個位置在自己的腳下拍攝自己,並在默認架構下無意中創建一些應該在dbo架構下存在(也許已經存在)的東西。現在你已經有了兩個版本。

    在某些時候,您或其他人(通常發生在生產中)運行查詢或執行存儲過程並得到意外的結果。需要相當長的一段時間才能發現同一對象有兩個[不同]版本,以及執行哪一個版本取決於他們的用戶憑證以及引用是否符合模式限定。

總是符合模式限定,除非您有真正的理由不要。這就是說,爲了開發的目的,有時可以保持個人模式下的「新」版本和「dbo」模式下的「當前」版本。它可以很容易地進行並行測試。然而,這並非沒有風險(見上文)。

0

當SQL看到語法時,它將首先查看當前用戶模式以查看錶是否存在,如果存在,將使用該語法。 如果沒有,那麼它會查看dbo架構並使用該表中的表