解析SQL Server 視圖、數(shù)據(jù)庫(kù)快照
簡(jiǎn)介數(shù)據(jù)庫(kù)快照
數(shù)據(jù)庫(kù)快照,正如其名稱(chēng)所示那樣,是數(shù)據(jù)庫(kù)在某一時(shí)間點(diǎn)的視圖。是SQL Server在2005之后的版本引入的特性。快照的應(yīng)用場(chǎng)景比較多,但快照設(shè)計(jì)最開(kāi)始的目的是為了報(bào)表服務(wù)。比如我需要出2011的資產(chǎn)負(fù)債表,這需要數(shù)據(jù)保持在2011年12月31日零點(diǎn)時(shí)的狀態(tài),則利用快照可以實(shí)現(xiàn)這一點(diǎn)??煺者€可以和鏡像結(jié)合來(lái)達(dá)到讀寫(xiě)分離的目的。下面我們來(lái)看什么是快照。
什么是快照
數(shù)據(jù)庫(kù)快照是 SQL Server 數(shù)據(jù)庫(kù)(源數(shù)據(jù)庫(kù))的只讀靜態(tài)視圖。換句話說(shuō),快照可以理解為一個(gè)只讀的數(shù)據(jù)庫(kù)。利用快照,可以提供如下好處:
提供了一個(gè)靜態(tài)的視圖來(lái)為報(bào)表提供服務(wù)
可以利用數(shù)據(jù)庫(kù)快照來(lái)恢復(fù)數(shù)據(jù)庫(kù),相比備份恢復(fù)來(lái)說(shuō),這個(gè)速度會(huì)大大提高(在下面我會(huì)解釋為什么)
和數(shù)據(jù)庫(kù)鏡像結(jié)合使用,提供讀寫(xiě)分離
作為測(cè)試環(huán)境或數(shù)據(jù)變更前的備份,比如我要大批導(dǎo)入或刪除數(shù)據(jù)前,或是將數(shù)據(jù)提供給測(cè)試人員進(jìn)行測(cè)試前,做一個(gè)快照,如果出現(xiàn)問(wèn)題,則可以利用快照恢復(fù)到快照建立時(shí)的狀態(tài)
SQL Server 視圖
什么是視圖?
視圖是一個(gè)虛擬的表,內(nèi)容源于查詢(xún)的結(jié)果集。只有當(dāng)視圖上建立了索引后,才會(huì)具體化。
視圖可以篩選和處理數(shù)據(jù),而不是直接訪問(wèn)基礎(chǔ)表。如:創(chuàng)建一個(gè)視圖,只展示源表中的幾列數(shù)據(jù),無(wú)需授予用戶(hù)訪問(wèn)基礎(chǔ)表的權(quán)限,取而代之的是授予視圖訪問(wèn)權(quán)限。
為什么用視圖?
1、如果是比較復(fù)雜的多表聯(lián)查,可以將這些復(fù)雜的語(yǔ)句放在視圖中完成,而我們只需要使用簡(jiǎn)單的語(yǔ)句查詢(xún)視圖即可。
2、保護(hù)基礎(chǔ)表,敏感列無(wú)法被檢索出。
3、對(duì)視圖添加索引,可以提高效率。
創(chuàng)建視圖
1、可以使用SSMS工具創(chuàng)建, 視圖->新建視圖->選表 選列 ->輸入名字保存即可。
2、使用T-SQL創(chuàng)建
if exists(select * from sysobjects where name = 'newView') --如果存在刪除 drop view newView go create view newView --創(chuàng)建視圖 as select 學(xué)號(hào)=id,姓名=name,年齡=age from student go select * from newView
關(guān)于order by
if exists(select * from sysobjects where name = 'newView') --如果存在刪除 drop view newView go create view newView --創(chuàng)建視圖 as select top 10 學(xué)號(hào)=id,姓名=name,年齡=age from student order by id desc --如果使用order關(guān)鍵字 則必須指定top go select * from newView
修改視圖
alter view newView as select top 20 * from student order by id desc --如果使用order關(guān)鍵字 則必須指定top go
更新架構(gòu)
--剛剛修改的視圖用的是 * 查詢(xún)的是全部列 --此時(shí)修改基礎(chǔ)表架構(gòu) alter table student add mail varchar(20) --這時(shí)源表已經(jīng)更新架構(gòu),但是視圖并沒(méi)有改變 需要調(diào)用系統(tǒng)存儲(chǔ)過(guò)程更新一下 EXEC sp_refreshview studentView --這時(shí) 新的列才會(huì)被加進(jìn)來(lái)
更新視圖
對(duì)視圖進(jìn)行增、刪、改操作,其實(shí)就是修改源表。但是由于諸多限制(如由多表聯(lián)查出的視圖,只檢索出個(gè)別字段,但是插入的時(shí)候有些源表上的值是非空的就會(huì)出問(wèn)題),一般不修改視圖。
所以更新源表即可更新視圖。
數(shù)據(jù)庫(kù)快照
數(shù)據(jù)庫(kù)快照是某一時(shí)間點(diǎn)的源數(shù)據(jù)庫(kù)的只讀靜態(tài)視圖,可以用來(lái)恢復(fù)數(shù)據(jù)庫(kù)。
使用數(shù)據(jù)庫(kù)快照必須與源數(shù)據(jù)庫(kù)在相同的服務(wù)器實(shí)例,并且不能對(duì)源數(shù)據(jù)庫(kù)進(jìn)行刪除、分離、或還原操作。
使用數(shù)據(jù)庫(kù)快照
--源表中數(shù)據(jù) use webDB go select * from student
if exists(select * from sys.databases where name = 'webDB_DBSS') drop database webDB_DBSS --存在則刪除 go create database webDB_DBSS --創(chuàng)建數(shù)據(jù)庫(kù)快照 on ( name = webDB, filename='d:\webDB_DBSS.ss' --注意后綴.ss ) --如果有多個(gè)文件需要一一指出 as snapshot of webDB go
--修改源數(shù)據(jù)庫(kù)數(shù)據(jù) use webDB go update student set name='偉大' where id = 10 --查詢(xún)?cè)磾?shù)據(jù)庫(kù)數(shù)據(jù) select * from student where id = 10 --查詢(xún)快照數(shù)據(jù) use webDB_DBSS go select * from student where id = 10
修改源數(shù)據(jù)庫(kù),快照數(shù)據(jù)庫(kù)并未發(fā)生改變。
--修改student表架構(gòu) alter table webDB.dbo.student add [address] varchar(20) select * from webDB.dbo.student --快照中依然沒(méi)有 select * from webDB_DBSS.dbo.student --刪除源數(shù)據(jù)庫(kù)student表 drop table webDB.dbo.newTable --查詢(xún)數(shù)據(jù)庫(kù)快照該表 依然存在 select * from webDB_DBSS.dbo.newTable
從快照恢復(fù)數(shù)據(jù)到快照創(chuàng)建時(shí)刻
restore database webDB from database_snapshot='webDB_DBSS' go select * from webDB.dbo.student --修改的值被改回 select * from webDb.dbo.newTable --被刪除的表 改回
以上得知:任何創(chuàng)建快照之后的修改數(shù)據(jù)都將被改回!
- Mysql數(shù)據(jù)庫(kù)高級(jí)用法之視圖、事務(wù)、索引、自連接、用戶(hù)管理實(shí)例分析
- PostgreSQL數(shù)據(jù)庫(kù)視圖及子查詢(xún)使用操作
- Sql Server 視圖數(shù)據(jù)的增刪改查教程
- 簡(jiǎn)析SQL Server數(shù)據(jù)庫(kù)用視圖來(lái)處理復(fù)雜的數(shù)據(jù)查詢(xún)關(guān)系
- SQLite教程(三):數(shù)據(jù)表和視圖簡(jiǎn)介
- sql server判斷數(shù)據(jù)庫(kù)、表、列、視圖是否存在
- MySQL數(shù)據(jù)庫(kù)數(shù)據(jù)視圖
相關(guān)文章
mysql?sum(if())和count(if())的用法說(shuō)明
這篇文章主要介紹了mysql?sum(if())和count(if())的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01MySQL中的批量修改、插入操作數(shù)據(jù)庫(kù)
在平常的項(xiàng)目中,我們會(huì)需要批量操作數(shù)據(jù)庫(kù)的時(shí)候,例如:批量修改,批量插入,那我們不應(yīng)該使用 for 循環(huán)去操作數(shù)據(jù)庫(kù),這樣會(huì)導(dǎo)致我們反復(fù)與數(shù)據(jù)庫(kù)發(fā)生連接和斷開(kāi)連接,影響性能和增加操作時(shí)間,所以可以使用SQL 批量修改的方式去操作數(shù)據(jù)庫(kù),感興趣的朋友一起學(xué)習(xí)下吧2023-09-09mysql的數(shù)據(jù)壓縮性能對(duì)比詳情
這篇文章主要介紹了mysql的數(shù)據(jù)壓縮性能對(duì)比,今天對(duì)這兩種方式分別進(jìn)行了測(cè)試,對(duì)比了二者在磁盤(pán)占用以及查詢(xún)性能方面各自的優(yōu)劣,下面我們大家一起進(jìn)入文章了解詳細(xì)內(nèi)容,需要的朋友也可以參考一下2021-11-11MySQL InnoDB row_id邊界溢出驗(yàn)證的方法步驟
這篇文章主要給大家介紹了關(guān)于MySQL InnoDB row_id邊界溢出驗(yàn)證的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用MySQL InnoDB具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10基于mysql 5.5 設(shè)置字符集問(wèn)題的詳解
本篇文章是對(duì)關(guān)于mysql 5.5設(shè)置字符集的問(wèn)題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06