自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

SQL Server 2000的視圖中必須小心使用*符號

數(shù)據(jù)庫 SQL Server
SQL Server 2000 是Microsoft 公司推出的SQL Server 數(shù)據(jù)庫管理系統(tǒng)的一個版本。SQL Server 2000 繼承了之前版本的優(yōu)點,同時又比它增加了許多更先進的功能,具有使用方便,可伸縮性好與相關(guān)軟件集成程度高等優(yōu)點,下面我將為大家介紹關(guān)于SQL Server 2000的視圖中必須小心使用*符號。

導讀:SQL Server 2000的視圖中一個小小的“*”會帶來什么問題呢?下文中將會給大家?guī)泶鸢浮?/p>

有些朋友看到這個標題可能會有疑問,難道在視圖中使用*符號還有何要注意的地方嗎?對于這個問題,我們先不必回答,先看一下例子吧。

我這里,使用的數(shù)據(jù)庫是SqlServer2000自帶的Northwind,這樣方便大家自己私下里測試。

首先,創(chuàng)建兩個視圖,視圖的腳本如下:

  --視圖 vCustomersA
  create view vCustomersA
  as
  select CustomerID ,CompanyName,ContactName,ContactTitle,
  Address,City,Region,PostalCode,Country,Phone,Fax
  from dbo.Customers
  go

  --視圖 vCustomersB
  create view vCustomersB
  as
  select * from vCustomersA
  go

然后,使用這兩個視圖查詢客戶ID為ALFKI的資料,查詢語句如下:

  select * from vCustomersA where CustomerID = 'ALFKI'
  select * from vCustomersB where CustomerID = 'ALFKI'

 

查詢的結(jié)果如下:

  一切正常,這個時候,需求發(fā)生了變化,我們需要改動vCustomersA,改動后的腳本如下:(為了說明問題,我們只是把CompanyName和ContactName互換一下位置)

  --改動后的視圖vCustomersA
  alter view vCustomersA
  as
  select CustomerID ,ContactName,CompanyName,ContactTitle,
  Address,City,Region,PostalCode,Country,Phone,Fax
  from dbo.Customers
  go

  這個時候,當我們再次使用視圖vCustomersB查詢客戶ID為ALFKI的資料的時候,錯誤已經(jīng)悄然來臨,你注意到了嗎?讓我們來看一下這兩個視圖的查詢結(jié)果吧,查詢語句如下:

  select * from vCustomersA where CustomerID = 'ALFKI'
  select * from vCustomersB where CustomerID = 'ALFKI'

  查詢的結(jié)果發(fā)生變化。你注意到數(shù)據(jù)的異常了嗎?使用視圖vCustomersB查詢的結(jié)果出現(xiàn)了錯誤,CompanyName顯示的資料是:Maria Anders,而在視圖vCustomersA查詢的結(jié)果中CompanyName是:Alfreds Futterkiste。我們僅僅是在vCustomersA中互換了兩個字段的位置,再次使用vCustomersB查詢數(shù)據(jù)卻發(fā)生了數(shù)據(jù)錯位的現(xiàn)象,這是什么原因?qū)е碌哪?

 

 帶著這個問題,讓我們?nèi)チ私庖幌?,何謂視圖?在Sql Server2000的幫助文檔中是這樣描述視圖的,定義如下:“視圖是一個虛擬表,其內(nèi)容由查詢定義,同真實的表一樣,視圖包含一系列帶有名稱的列和行數(shù)據(jù)。但是,視圖并不在數(shù)據(jù)庫中以存儲的數(shù)據(jù)值集形式存在。行和列數(shù)據(jù)來自由定義視圖的查詢所引用的表,并且在引用視圖時動態(tài)生成。”通過這個定義我們可以看出,視圖是一個虛擬的表,它僅僅包括視圖的定義腳本,查詢的內(nèi)容則是動態(tài)的生成。當我們創(chuàng)建了一個視圖以后,視圖的腳本會保存到當前數(shù)據(jù)庫的系統(tǒng)表syscomments里,我們可以通過系統(tǒng)提供的存儲過程:sp_helptext查詢得到視圖的定義腳本。從定義上看,好像并不能得到我們想要的答案,那么我們就先不管Sql Server2000是如何實現(xiàn)視圖的,我們先來解決一下當前的問題(我上面提到的)。可能有些朋友已經(jīng)知道了解決問題的辦法了,那就是把vCustomersB的定義腳本重新執(zhí)行一下(其實只需要把create換成alter執(zhí)行一下就可以),腳本如下:

  --重新執(zhí)行一下vCustomersB的定義腳本

  alter view vCustomersB
  as
  select * from vCustomersA
  go

  那么,除了這個方法以外,其實SqlServer2000也提供了一個擴展存儲過程sp_refreshview來幫我們做這件事情,調(diào)用的腳本如下:

  --刷新指定視圖的元數(shù)據(jù)

  exec sp_refreshview 'vCustomersB'

  我個人目前就知道這兩個辦法,不知道,你還有沒有其他的辦法,有的話可以一起分享一下。

 

sp_refreshview的功能描述為:“刷新指定視圖的元數(shù)據(jù)。由于視圖所依賴的基礎(chǔ)對象的更改,視圖的持久元數(shù)據(jù)會過期。”由于sp_refreshview的代碼被封裝了(沒有公開),所以我們看不到它的內(nèi)部實現(xiàn),不過看了這個存儲過程的描述,你是否對視圖有了新的認識呢?

  從這里,我們可以看到,當我們使用一個視圖查詢數(shù)據(jù)的時候,其實我們是在使用視圖的元數(shù)據(jù)來查詢的,當視圖依賴的對象發(fā)生了變化以后,視圖的元數(shù)據(jù)就需要更新,這樣,使用視圖時才不會違背我們的意愿。

  知道了問題的產(chǎn)生的原因后,那么我們在重新修改一個表或視圖的腳本時,我們就需要更新依賴于該對象的視圖,否則就會出現(xiàn)意想不到的錯誤。如何找到依賴于該對象的對象(包括視圖,觸發(fā)器,存儲過程)呢?SqlServer2000在該數(shù)據(jù)庫的系統(tǒng)表sysdepends里記錄這些依賴關(guān)系,所以你可以查詢該表獲取你想要的信息,但其實,你可以通過使用系統(tǒng)提供的存儲過程:sp_depends來獲取該對象的所依賴的對象(返回的***個表)以及依賴于該對象的對象(返回的第二個表),腳本如下:

  --查詢vCustomersA的依賴的對象以及依賴于vCustomersA的對象

  exec sp_depends 'vCustomersA'

 

查詢的結(jié)果如下:

  注:sp_depends的代碼是公開的,有興趣的可以看一下其實現(xiàn)過程。

  到此,你應該明白,當你更新你的表或視圖的時候,你還要刷新依賴于這些對象的視圖的元數(shù)據(jù),即需要調(diào)用sp_refreshview來刷新依賴于該對象的視圖。但是你在查詢依賴于一個表或者視圖的對象集合的時候需要注意的一點是,在你更新了一個表或視圖之后,那些之前創(chuàng)建的依賴于該表或視圖的依賴關(guān)系將會丟失(你更新的表或視圖所依賴的對象集合不會丟失),用我之前的例子來看,vCustomersB依賴于vCustomersA,那么當我們修改了vCustomersA以后,vCustomersB與vCustomersA之間的依賴關(guān)系將會丟失而vCustomersA所依賴的Customers將不會丟失(依賴關(guān)系在對象創(chuàng)建或更新時創(chuàng)建,更新時,會把先前的依賴關(guān)系刪掉)。(調(diào)用sp_depends你就可以看出來這種微妙的變化)

  希望在你閱讀了本文以后,你在使用視圖的時候會更加的得心應手,避免錯誤發(fā)生。還有,這篇文章中的內(nèi)容也不是絕對權(quán)威的,而且技術(shù)發(fā)展的很快,這些技術(shù)可能在若段時間之后就會被推翻,所以如果有說的不對的地方,歡迎大家隨時給指正。

【編輯推薦】

  1. SQL Server視圖管理中的四個限制條件
  2. SQL Server 2000數(shù)據(jù)庫崩潰后的補救措施
  3. 配置SQL Server 2000九大措施安全
  4. SQL Server視圖的使用
責任編輯:迎迎 來源: 賽迪網(wǎng)
相關(guān)推薦

2011-04-02 13:37:05

SQL Server 索引視圖

2010-11-12 11:19:19

SQL Server視

2010-07-16 10:48:24

MS SQL Serv

2024-08-19 10:29:26

SQL加密選項模式綁定

2010-11-11 17:15:13

SQL Server視

2010-07-16 15:42:32

SQL Server

2010-11-09 15:06:52

SQL Server動

2010-07-09 10:36:22

SQL Server

2010-09-27 09:54:26

Sql Server視

2010-11-10 15:23:55

SQL SERVER

2010-06-18 13:14:26

SQL Server

2010-07-14 10:43:00

SQL Server

2011-04-02 17:21:29

sql server視圖

2010-09-13 11:09:34

SQL SERVER分

2010-11-11 17:20:51

SQL Server創(chuàng)

2010-07-14 10:11:30

SQL Server系

2015-07-22 17:27:41

SQL SERVER 鏈接

2009-05-26 10:21:07

2010-07-07 17:11:46

SQL Server

2011-08-02 15:39:30

SQL Server iSql
點贊
收藏

51CTO技術(shù)棧公眾號