SQL Server 視圖 (虛擬表) 與資料庫快照 (靜態唯讀副本) 實戰指南:視圖建立/修改/索引/架構同步,快照建立/查詢/恢復/結構隔離驗證。
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;
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 'newView'; -- 或 studentView -- 此後 SELECT * FROM newView 才會包含 mail 欄位
對視圖 INSERT/UPDATE/DELETE 實為操作基礎表,但多表 JOIN、衍生欄位、聚合等場景受限,**建議直接操作基礎表**。
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;
GO
-- 修改源資料庫 USE webDB; UPDATE student SET name='偉大' WHERE id = 10; -- 查詢源庫: 顯示 '偉大' SELECT * FROM student WHERE id = 10; -- 查詢快照: 仍顯示原值 USE webDB_DBSS; SELECT * FROM student WHERE id = 10;
-- 源庫新增欄位/刪除表 ALTER TABLE webDB.dbo.student ADD address VARCHAR(20); DROP TABLE webDB.dbo.newTable; -- 快照完全不受影響 SELECT * FROM webDB_DBSS.dbo.student; -- 無 address 欄位 SELECT * FROM webDB_DBSS.dbo.newTable; -- 表仍存在
RESTORE DATABASE webDB FROM DATABASE_SNAPSHOT = 'webDB_DBSS'; GO -- 所有修改被撤銷,結構變更被回滾 SELECT * FROM webDB.dbo.student; -- name 還原 SELECT * FROM webDB.dbo.newTable; -- 表恢復