視圖是虛擬表,數據源於查詢結果集。除非建立索引視圖,否則不佔用物理存儲。
T-SQL 語法:
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'newView')
DROP VIEW newView;
GO
CREATE VIEW newView
AS
SELECT 學號=id, 姓名=name, 年齡=age FROM student;
GO
SELECT * FROM newView;
視圖定義中使用 ORDER BY 必須配合 TOP:
CREATE VIEW newView AS SELECT TOP 10 學號=id, 姓名=name, 年齡=age FROM student ORDER BY id DESC;
ALTER VIEW newView AS SELECT TOP 20 * FROM student ORDER BY id DESC;
基表結構變更(如新增列)後,視圖不會自動更新,需調用系統存儲過程:
ALTER TABLE student ADD mail VARCHAR(20); EXEC sp_refreshview 'studentView';
對視圖增刪改實際操作基表,但受限較多(如多表聯查視圖不可更新),建議直接維護基表。
數據庫快照是源數據庫在某一時間點的只讀靜態視圖(SQL Server 2005+ 引入)。主要用途:
1. 創建快照
IF EXISTS (SELECT * FROM sys.databases WHERE name = 'webDB_DBSS')
DROP DATABASE webDB_DBSS;
GO
CREATE DATABASE webDB_DBSS
ON (NAME = webDB, FILENAME = 'd:\webDB_DBSS.ss') -- 必須 .ss 後綴
AS SNAPSHOT OF webDB;
2. 驗證快照隔離性
-- 源庫修改數據 USE webDB; UPDATE student SET name='偉大' WHERE id = 10; SELECT * FROM student WHERE id = 10; -- 顯示'偉大' -- 快照數據不變 USE webDB_DBSS; SELECT * FROM student WHERE id = 10; -- 仍顯示原值
3. 結構變更不影響快照
ALTER TABLE webDB.dbo.student ADD [address] VARCHAR(20); -- 快照中無 address 列 SELECT * FROM webDB_DBSS.dbo.student; DROP TABLE webDB.dbo.newTable; -- 快照中表仍存在 SELECT * FROM webDB_DBSS.dbo.newTable;
4. 從快照恢復源庫
RESTORE DATABASE webDB FROM DATABASE_SNAPSHOT = 'webDB_DBSS'; -- 源庫數據、結構全部回滾到快照創建時刻
快照創建幾乎瞬間完成(僅建立稀疏文件指針),恢復速度極快,是高可用架構中的利器。