首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 檢視表 完整指南:建立、修改、刪除與四大核心用途

     編輯:關於SqlServer

什麼是檢視表?

檢視表 是一個**虛擬資料表**,其內容由一個 SELECT 查詢定義。它**不儲存實體資料**,只儲存查詢定義。每次查詢檢視表時,資料庫引擎會動態執行底層查詢並回傳結果。

檢視表 vs 資料表

特性資料表檢視表
資料儲存實體儲存資料列不儲存資料,只存查詢定義
佔用空間佔用資料/索引頁面極小 (僅元資料)
資料即時性即時即時 (每次查詢重新運算)
可更新性完全可更新符合條件時可更新 (單一基底表、無聚合、無 DISTINCT 等)

檢視表四大核心用途

  1. 資料列篩選:僅暴露特定條件的資料列 (如 WHERE Status = 'Active')。
  2. 資料行權限控管:隱藏敏感欄位 (如薪資、身分證字號),只授權 SELECT 檢視表。
  3. 簡化複雜查詢:將多表 JOIN、子查詢、聚合封裝,應用端只需 SELECT * FROM v_Simple。
  4. 邏輯資料獨立性:基底表結構變更時,只需修改檢視表定義,應用程式碼無須動工。

建立檢視表語法

CREATE VIEW [schema.]view_name [(column_alias_list)]
[WITH ENCRYPTION | SCHEMABINDING | VIEW_METADATA]
AS
SELECT column_list
FROM table_sources
[WHERE condition]
[GROUP BY ...]
[HAVING ...]
[WITH CHECK OPTION] -- 僅允許符合 WHERE 條件的資料被修改
GO

實戰範例:多表 JOIN 封裝

CREATE VIEW v_OfficeDetail
AS
SELECT
    o.OfficeName AS 樓盤名稱,
    c.AreaName AS 城市,
    a.AreaName AS 區域,
    s.AreaName AS 街道
FROM dbo.Office_Info AS o
INNER JOIN dbo.Base_Area AS c ON o.CityID = c.AreaID
INNER JOIN dbo.Base_Area AS a ON o.AreaID = a.AreaID
INNER JOIN dbo.Base_Area AS s ON o.StreetID = s.AreaID;
GO

-- 使用檢視表
SELECT * FROM v_OfficeDetail WHERE 城市 = N'台北市';

修改與刪除檢視表

修改 (保留權限/相依性)

ALTER VIEW v_OfficeDetail
AS
SELECT o.OfficeName, c.AreaName AS City
FROM dbo.Office_Info o
INNER JOIN dbo.Base_Area c ON o.CityID = c.AreaID; -- 簡化版

刪除

IF EXISTS (SELECT * FROM sys.views WHERE name = 'v_OfficeDetail')
    DROP VIEW v_OfficeDetail;

進階選項詳解

選項用途限制/影響
SCHEMABINDING綁定基底表結構,防止被修改/刪除導致檢視表失效必須使用兩部分名稱 (schema.table);基底表不可 DROP/ALTER 破壞結構
WITH ENCRYPTION加密檢視表定義,防止 sp_helptext 檢視無法反編譯 (需第三方工具);備份腳本會失去定義
VIEW_METADATA讓 ODBC/OLEDB 客戶端將檢視表視為可更新資料表較少使用
WITH CHECK OPTION透過檢視表修改資料時,強制符合 WHERE 條件防止「透過檢視表更新」導致資料落出檢視範圍

SCHEMABINDING 實戰範例

CREATE VIEW v_OfficeSchemaBound
WITH SCHEMABINDING
AS
SELECT OfficeID, OfficeName, CityID
FROM dbo.Office_Info; -- 必須 dbo.Office_Info

-- 此時嘗試 ALTER TABLE dbo.Office_Info DROP COLUMN CityID 會失敗,提示受檢視表綁定

索引檢視表 - 將檢視表物質化

在檢視表上建立 **叢集索引**,即可將結果集實體儲存,查詢時直接讀取索引頁面,大幅提升聚合/多表 JOIN 查詢效能。

建立條件 (嚴格)

  • WITH SCHEMABINDING
  • 不含 OUTER JOIN、DISTINCT、UNION、subquery、aggregate (除 COUNT_BIG(*)) 等
  • 所有函數必須具決定性
  • ANSI_NULLS, QUOTED_IDENTIFIER 等 SET 選項正確

範例

CREATE VIEW v_SalesSummary
WITH SCHEMABINDING
AS
SELECT ProductID, COUNT_BIG(*) AS Cnt, SUM(UnitPrice) AS TotalPrice
FROM dbo.SalesOrderDetail
GROUP BY ProductID;
GO

CREATE UNIQUE CLUSTERED INDEX IX_v_SalesSummary ON v_SalesSummary (ProductID);
GO

-- 查詢自動使用索引檢視表 (Enterprise Edition 自動匹配,Standard 需加 NOEXPAND HINT)
SELECT ProductID, Cnt FROM v_SalesSummary WHERE ProductID = 777;

常見陷阱與最佳實務

  • 避免巢狀檢視表:檢視表呼叫檢視表,導致最佳化器難以估算成本,效能難控。
  • 不要在檢視表加 ORDER BY:除非搭配 TOP,否則無意義且浪費資源。
  • 權限管理:GRANT SELECT ON v_Sensitive TO Role_A; 實現欄位級安全。
  • 命名慣例:v_ 前綴 + PascalCase,如 v_CustomerOrderSummary。

總結

檢視表是**封裝查詢邏輯、實現安全控管、簡化應用開發**的利器。善用 SCHEMABINDING 保護結構穩定,必要時建立 **索引檢視表** 獲得物質化查詢加速。遵循「單一職責、扁平化、權限最小化」原則設計檢視表,能大幅降低系統複雜度。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved