利用同義詞簡化SQL Server 2005開發

2021-09-22 03:34:50 字數 3060 閱讀 5214

一. 引言

如果你曾經使用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許可權。

四. 把同義詞作為乙個抽象層

除了節省你的輸入時間外,同義詞還可以用作你的資料庫的不穩定的或經常更新部分的乙個抽象層。這是因為同義詞及其基物件之間的繫結僅在執行時刻檢查,而不是在設計時刻。

為了說明這個問題,如果你重新定義prodcat同義詞,請研究下面發生什麼情況:

drop synonym prodcat

create synonym prodcat

for adventureworks.production.productcategory

select * from prodcat

drop synonym prodcat

create synonym prodcat

for adventureworks.production.culture

select * from prodcat

注意,當你任何時候想改變乙個同義詞時,你需要使用drop和create;不存在alter synonym語句。圖2顯示出執行這個批處理語句的結果。

注意,在此,語句select * from prodcat與前面的第二次執行結果懸殊很大,因為同義詞被重新定義以參考乙個不同的表。

當然,你可以把這種行為應用於你自己的應用程式中。例如,假定你有乙個程式,它需要分析來自於多種資料庫的顧客資料。不是把基表與單個資料庫連線起來或 斷開連線,或編寫複雜的選擇**進行分析的sql,而是使用同義詞。定義乙個同義詞,例如datatable,來參考你想使用的資料的四部分名字,並且重 新定義它-無論何時你想要切換源資料。

當然,這種遲繫結也是一把雙刃劍。因為sql server並不追蹤是否乙個同義詞指向任何東西,它也不會進行任何模式繫結排序。如果你刪除乙個應用於另乙個語句中的同義詞,那麼你可能直到試圖執行該語句時才發現出了問題。

五. 小結

你能夠開發自己的下乙個sql server應用程式而不使用同義詞嗎?當然可以。它們並沒有為資料庫表帶來根本性的新內容;你可以總是使用完全限定名字-在任何你想使用乙個同義詞的地 方。但是有時把這些"小東西"加入到你的產品是一件不錯的事情,就因為它們能夠實現更少的輸入和帶給開發者一種更容易的體驗。也許在乙個應用程式的開發過 程的某一階段同義詞將僅會節省你10分鐘時間,但是所有這些小的10分鐘相加應該是個不少的數目吧!

利用同義詞簡化SQL Server 2005開發

轉 一.引言 server.database schema name object name server1.adventureworks.production.productcategory adventureworks.production.productcategory adventurewo...

常見同義詞

目錄originate from derive from stem from spring from giant n.故事中常為殘酷而愚蠢的 巨人 巨人 巨獸 巨型植物 大公司 強大的組織 adj.巨大的 特大的 偉大的 vast adj.遼闊的 巨大的 龐大的 大量的 tremendous adj...

同義詞(別名)

同義詞 別名 注意 如果檢視其他使用者的表,報錯表或檢視不存在 可能是許可權不足 需要授權 conn as sysdba grant select on hr.employees to scott conn scott tiger select count from hr.employees con...