觀看次數總覽

本文將介紹並說明 Spanner 檢視表。

總覽

檢視表是由 SQL 查詢定義的虛擬資料表。建立檢視表時,您需要指定檢視表代表的 SQL 查詢。建立檢視表後,您可以執行查詢,將檢視表視為資料表。

執行參照檢視表的查詢時,Spanner 會執行檢視表中定義的查詢,建立虛擬資料表,並由參照查詢使用該虛擬資料表的內容。

每次執行參照檢視表的查詢時,系統都會執行定義檢視表的查詢,因此檢視表有時稱為邏輯檢視表或動態檢視表,以便與 SQL materialized view 區分。SQL materialized view 會將定義檢視表的查詢結果,儲存為資料儲存庫中的實際資料表。

在 Spanner 中,您可以建立「叫用者權限檢視表」或「定義者權限檢視表」。這兩種安全性模型可控管使用者對檢視表的存取權。

叫用者權限檢視表定義者權限檢視表
說明 如果您以叫用者權限建立檢視表,資料庫角色必須具備檢視表的權限,以及檢視表參照的所有結構定義物件,才能查詢檢視表。詳情請參閱「叫用者權限檢視表」。 如果您以定義者權限建立檢視表,資料庫角色必須具備檢視表的權限 (且僅限檢視表),才能查詢檢視表。請搭配使用精細的存取控管和定義者權限檢視表,否則定義者權限檢視表不會新增任何額外的存取控管。詳情請參閱「定義者權限檢視表」。
建立檢視表所需的權限 如要建立、授予及撤銷任一檢視表類型的存取權,您必須具備資料庫層級的 spanner.database.updateDdl 權限。
查詢檢視表所需的權限 資料庫角色必須具備檢視表和所有基礎結構定義物件的權限,才能查詢檢視表。 資料庫角色必須具備檢視表的權限 (且僅限檢視表),才能查詢檢視表。

參數化檢視表

參數化檢視表可強化標準檢視表,提供更強大的資料保護功能,特別是在使用 AI 代理或大型語言模型 (LLM) 的應用程式中。主要用途是將參數 (例如使用者身分) 安全地直接插入檢視表定義中。這類檢視表需要定義者權限檢視表安全性模型,Spanner 才能根據查詢使用者,動態強制執行資料列層級安全性。

詳情請參閱「參數化檢視表總覽」。

檢視表的優點

相較於在應用程式邏輯中加入定義的查詢,檢視表具有多項優點。

  • 檢視表可為應用程式提供邏輯資料模型。

    有時,在 Spanner 上進行實體資料建模的合理選擇,不一定是讀取該資料的應用程式的最佳抽象化。檢視表可以呈現替代資料表結構定義,更適合用於應用程式。

  • 檢視表會集中管理查詢定義,因此可簡化維護作業。

    為常用或複雜的查詢建立檢視表,即可將查詢文字從應用程式中抽離並集中管理。這樣一來,您就能更輕鬆地在各個應用程式中保持查詢文字最新狀態,並在不變更應用程式程式碼的情況下,修訂及調整查詢。

  • 檢視表可確保結構定義變更時的穩定性。

    由於定義檢視表的查詢儲存在資料庫結構定義中,而非應用程式邏輯中,因此 Spanner 可以確保查詢參照的物件 (資料表、資料欄等) 結構定義變更不會導致查詢失效。

常見用途

如果 Spanner 資料庫包含高度權限資料,不應向所有資料庫使用者公開,或您想封裝資料,請使用檢視表。

如果檢視表不需要額外的安全性功能,且檢視表的所有叫用者都能存取檢視表參照的所有結構定義物件,請建立叫用者權限檢視表。

如要建立檢視表,但不希望所有叫用者都能存取檢視表參照的所有結構定義物件,請建立定義者權限檢視表。定義者權限檢視表受到更完善的保護,且限制更多,因為資料庫管理員可以為較少的使用者提供檢視表參照的資料表和資料欄權限。如果使用者需要安全存取 Spanner 資料庫的相關子集,定義者權限檢視表就非常實用。舉例來說,您可能想為下列資料建立定義者權限檢視表:

  • 個人帳戶資料 (例如應用程式客戶)。
  • 角色專屬資料 (例如人資人員、銷售專員)。
  • 特定位置資料。

叫用者權限檢視表

如果檢視表具有叫用者權限,代表使用者 (叫用者) 對檢視表執行查詢時,Spanner 會檢查使用者對檢視表和檢視表參照的所有結構定義物件是否具有權限。使用者必須具備所有結構定義物件的權限,才能查詢檢視表。

定義者權限檢視表

定義者權限檢視表可為檢視表增添額外的安全性功能。並提供檢視表和基礎結構定義物件的不同權限。與叫用者權限檢視表一樣,使用者必須具備資料庫層級權限,才能建立定義者權限檢視表。主要差異在於,當資料庫角色查詢定義者的權限檢視表時,Spanner 會驗證該角色是否能存取檢視表本身 (且僅限檢視表)。因此,即使查詢檢視表的使用者無法存取所有基礎結構定義物件,仍可存取檢視表並查看內容。定義者權限檢視表可讓使用者存取最新資料,但僅限檢視表中定義的資料列。

Spanner Identity and Access Management (IAM) 權限是在資料庫層級授予。請搭配使用精細的存取控管和定義者權限檢視表,否則定義者權限檢視表不會新增任何額外的存取控管。這是因為如果使用者具備資料庫的讀取權限,就具備資料庫中所有結構定義物件的讀取權限。在資料庫設定精細的存取控管機制後,具備檢視表 SELECT 權限的精細存取控管使用者,以及具備資料庫層級權限的使用者,都能查詢檢視表。差別在於,精細的存取控管使用者不需要基礎物件的權限。

檢視表的限制

與實際資料表相比,檢視表有一些限制,因此不適用於某些用途。

  • 檢視表為唯讀。無法用於新增、更新或刪除資料。

    您無法在 DML 陳述式 (INSERT、UPDATE、DELETE) 中使用檢視表。

  • 定義檢視表的查詢無法使用查詢參數。

  • 無法為檢視表建立索引。

  • 檢視表的參照無法使用資料表提示。

    不過,定義檢視表的查詢可以包含所參照資料表的資料表提示。

  • Read API 不支援檢視表。

  • Spanner Data Boost 不支援定義者權限檢視表。

    在 Data Boost 中執行含有定義者權限檢視表的查詢,會導致錯誤。

  • 如要存取定義者權限檢視表,建議使用 NORMAL 查詢模式。

    如果使用者無權存取定義者權限檢視表的基礎結構定義物件,在一般模式以外的查詢模式中執行查詢時,就會收到錯誤訊息。

  • 使用者可以建立精心設計的查詢,導致 Spanner 擲回錯誤,顯示或揭露定義者權限檢視表中沒有的資料。

    舉例來說,假設有以下檢視表 QualifiedStudentScores,會傳回符合課程資格的學生分數。資格條件取決於學生的等級和測驗分數。如果學生的等級等於或低於六,分數就很重要,學生必須在考試中獲得至少 50 分才能符合資格。否則,如果等級等於或大於六,學生預設符合資格。

      CREATE VIEW QualifiedStudentScores
      SQL SECURITY DEFINER AS
      SELECT
        s.Name,
        s.Level,
        sc.Score
      FROM Students AS s
      JOIN Scores AS sc ON sc.StudentId = s.StudentId
      WHERE
      (CASE
        WHEN (s.Level < 6) OR (s.Level >= 6 AND sc.Score >= 50)
          THEN 'QUALIFIED';
        ELSE 'FAILED';
      END) = 'QUALIFIED';
    

    使用者可以執行 SELECT * FROM QualifiedStudentScores s WHERE s.Level = 7 AND 1/(s.Score - 20) = 1; 形式的查詢。如果第 7 級有學生獲得 20 分,即使檢視表將該級別的資料限制為 50 分以上,這項查詢仍可能失敗,並顯示除以零的錯誤。

使用檢視表時的查詢效能

參照檢視表的查詢,與將檢視表參照替換為檢視表定義的相同查詢,兩者的效能相當。

檢視表適用的配額和限制

  • 「配額與限制」頁面會列出檢視表專屬的配額和限制資訊。

  • 在查詢中使用檢視表,可能會影響查詢是否符合查詢限制,因為檢視表的定義會成為查詢的一部分。

對費用的影響

使用檢視表對執行個體成本的影響非常小:

  • 與在參照檢視表的查詢中嵌入定義的查詢文字相比,使用檢視表不會影響執行個體的運算能力需求。

  • 使用檢視表對執行個體的資料庫儲存空間影響極小,因為執行檢視表的查詢定義所產生的資料表不會儲存至永久資料庫儲存空間。

後續步驟