一. 引言
如果你曾經使用SQL Server開發過任何軟件,那麼你肯定會習慣於使用四部分標識符來參考一個對象:
[[[server.][database].][schema_name].]object_name
正如上面的方括號所顯示的,該語法的不同部分可以被忽略,只要你提供足夠的表達來無二義地標識你的對象即可。例如,下面所有這些表達都可能參考相同的對象:
Server1.AdventureWorks.Production.ProductCategory
AdventureWorks.Production.ProductCategory
AdventureWorks..ProductCategory
ProductCategory
在大多數情況下,你可以僅使用三部分名字而忽略服務器名-除非你是在處理在一個連接的服務器上的對象。默認情況下,所有對象的上下文都是本地數據庫-你的SQL語句在其中執行。但是,有些情況下,或者更為准確地說,你必須使用這整個四部分命名(或稱作一種全稱限定名)。但是,在SQL Server 2005中,這種情況有所改變。
二. 熟悉同義詞
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顯示出相應的結果:
當你使用完一個同義詞後,你可以使用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許可權。