一. 引言
如果你曾經使用SQL Server開發過任何軟體,那麼你肯定會習慣于使用四部分辨別符來參考一個對象:
[[[server.][database].][schema_name].]object_name
正如上面的方括号所顯示的,該文法的不同部分可以被忽略,隻要你提供足夠的表達來無二義地辨別你的對象即可。例如,下面所有這些表達都可能參考相同的對象:
Server1.AdventureWorks.Production.ProductCategory
AdventureWorks.Production.ProductCategory
AdventureWorks..ProductCategory
ProductCategory
在大多數情況下,你可以僅使用三部分名字而忽略伺服器名-除非你是在處理在一個連接配接的伺服器上的對象。預設情況下,所有對象的上下文都是本地資料庫-你 的SQL語句在其中執行。但是,有些情況下,或者更為準确地說,你必須使用這整個四部分命名(或稱作一種全稱限定名)。但是,在SQL Server 2005中,這種情況有所改變。
<b>二. 熟悉同義詞</b>
SQL Server 2005引入了一個同義詞的概念,這是一個單部分的名字,它可以替換在許多SQL語句中的一個兩、三或四部分的名字。使用同義詞可以讓你減少輸入,而且還 能提供一個抽象層來為你保護底層對象的改變。為了了解其工作原理,讓我們先看一下建立同義詞的文法。下面是CREATE SYNONYM語句的文法:
CREATE SYNONYM [schema_name.]synonym_name FOR object_name
在此,object_name是一個SQL Server對象(全稱限定已經足以能夠辨別出這個對象)的名字,而synonym_name是你想賦給它的新名字。如果你不想為同義詞指定一種模式,那 麼SQL Server使用目前的使用者的預設模式。當你建立同義詞時,相應的對象不需要存在,因為同義詞是遲綁定的:當你實際上使用同義詞時,SQL Server僅僅檢查基對象。
例如,在AdventureWorks示例資料庫中,你可以以下列方式建立一個同義詞:
CREATE SYNONYM ProdCat
FOR AdventureWorks.Production.ProductCategory
之後,你可以繼續使用在SQL語句中的同義詞了。例如:
SELECT * FROM ProdCat
圖1顯示出相應的結果:
<a href="http://dev.yesky.com/TLimages/picview/?/imagelist/06/30/bdqs96xhievk.png" target="_blank"></a>
當你使用完一個同義詞後,你可以使用DROP SYNONYM語句來去掉它,它具有你期望的文法格式:
DROP SYNONYM [schema_name.]synonym_name
三. 幾點細節
當然,對于同義詞的使用上也存在一些限制。對于初學者來說,你不能為任何東西都建立一個同義詞。SQL Server 2005比以前引入了更多的對象,但是同義詞僅限于應用于核心集的最有用的一些對象中:
· 表
· 視圖
· 存儲過程
· CLR存儲過程
· CLR函數
· 複制過濾過程
· 擴充存儲過程
· SQL标量,表值以及内聯表值函數
關于在什麼情況下使用同義詞還存在一些限制。一般來說,你可以在下面這些T-SQL語句中使用一個同義詞:
· SELECT
· sub-selects
· UPDATE
· INSERT
· DELETE
· EXECUTE
如果你仔細考慮一下,那麼第二個表不應該太奇怪:它包含了最常用的where語句。注意,你不能在一個DDL語句中參考一個同義詞。如果你想使用 ALTER TABLE來改變ProductCategory表中的内容,那麼,你需要使用基表而不是使用ProdCat同義詞。
為了建立一個同義詞,你需要CREATE SYNONYM權限。在建立一個同義詞後,它就有了與其自己相關聯的GRANT,DENY和REVOKE許可權。
<b>四. 把同義詞作為一個抽象層</b>
除了節省你的輸入時間外,同義詞還可以用作你的資料庫的不穩定的或經常更新部分的一個抽象層。這是因為同義詞及其基對象之間的綁定僅在運作時刻檢查,而不是在設計時刻。
為了說明這個問題,如果你重新定義ProdCat同義詞,請研究下面發生什麼情況:
DROP SYNONYM ProdCat
FOR AdventureWorks.Production.Culture
注意,當你任何時候想改變一個同義詞時,你需要使用DROP和CREATE;不存在ALTER SYNONYM語句。圖2顯示出運作這個批處理語句的結果。
<a href="http://dev.yesky.com/TLimages/picview/?/imagelist/06/30/fswy9wf1a7n9.png" target="_blank"></a>
注意,在此,語句SELECT * FROM ProdCat與前面的第二次執行結果懸殊很大,因為同義詞被重新定義以參考一個不同的表。
當然,你可以把這種行為應用于你自己的應用程式中。例如,假定你有一個程式,它需要分析來自于多種資料庫的顧客資料。不是把基表與單個資料庫連接配接起來或 斷開連接配接,或編寫複雜的選擇表格進行分析的SQL,而是使用同義詞。定義一個同義詞,例如DataTable,來參考你想使用的資料的四部分名字,并且重 新定義它-無論何時你想要切換源資料。
當然,這種遲綁定也是一把雙刃劍。因為SQL Server并不追蹤是否一個同義詞指向任何東西,它也不會進行任何模式綁定排序。如果你删除一個應用于另一個語句中的同義詞,那麼你可能直到試圖運作該語句時才發現出了問題。
<b>五. 小結</b>
你能夠開發自己的下一個SQL Server應用程式而不使用同義詞嗎?當然可以。它們并沒有為資料庫表帶來根本性的新内容;你可以總是使用完全限定名字-在任何你想使用一個同義詞的地 方。但是有時把這些"小東西"加入到你的産品是一件不錯的事情,就因為它們能夠實作更少的輸入和帶給開發者一種更容易的體驗。也許在一個應用程式的開發過 程的某一階段同義詞将僅會節省你10分鐘時間,但是所有這些小的10分鐘相加應該是個不少的數目吧!
本文轉自朱先忠老師51CTO部落格,原文連結:http://blog.51cto.com/zhuxianzhong/60084 ,如需轉載請自行聯系原作者