国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQL Server > 正文

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

2024-08-31 00:51:09
字體:
來源:轉載
供稿:網友
  一. 引言

  如果你曾經使用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分鐘相加應該是個不少的數目吧!
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 黑山县| 托克逊县| 新干县| 扬州市| 西华县| 安陆市| 凤冈县| 铁力市| 遵义县| 北辰区| 诏安县| 卢湾区| 柘城县| 平江县| 濉溪县| 虎林市| 馆陶县| 彭阳县| 华容县| 太白县| 资溪县| 象州县| 高阳县| 南陵县| 南乐县| 延寿县| 商洛市| 鹿泉市| 连山| 河北区| 南通市| 湟源县| 辛集市| 秀山| 贵南县| 兴国县| 勐海县| 托里县| 大名县| 湾仔区| 噶尔县|