觀看次數總覽

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

總覽

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

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

由於每次執行參照檢視表的查詢時,系統都會執行定義檢視表的查詢,因此檢視表有時也稱為邏輯檢視表或動態檢視表,以區別於 SQL 具體化檢視表。SQL 具體化檢視表會將定義檢視表的查詢結果儲存為資料儲存空間中的實際表格。

在 Spanner 中,您可以建立檢視區塊,做為呼叫端權限檢視區塊定義端權限檢視區塊。這兩種安全防護機制可控管使用者對檢視區塊的存取權。

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

觀看次數的好處

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

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

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

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

    您可以為廣泛使用或複雜的查詢建立檢視區塊,從應用程式中分解查詢文字並集中管理。這樣做可大幅簡化應用程式中查詢文字的更新作業,並允許修訂及調整查詢,不必變更應用程式碼。

  • 檢視區塊可在結構定義變更時提供穩定性。

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

常見用途

如果 Spanner 資料庫包含不應向所有資料庫使用者公開的高度私密資料,或是您想封裝資料,請使用檢視畫面。

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

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

  • 個人帳戶資料 (例如應用程式客戶)。
  • 特定角色的資料 (例如人資人員、銷售助理)。
  • 特定地點的資料。

呼叫端權限檢視畫面

如果檢視區具備呼叫端權限,表示當使用者 (呼叫端) 對檢視區執行查詢時,Spanner 會檢查使用者在檢視區和檢視區參照的所有結構定義物件上的權限。使用者必須具備所有結構定義物件的權限,才能查詢檢視區塊。

定義者的權利檢視畫面

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

Spanner 身分與存取權管理 (IAM) 權限是在資料庫層級授予。請搭配使用精細的存取權控管和定義者的權利檢視畫面,否則定義者的權利檢視畫面不會新增任何額外的存取權控管。這是因為使用者如果擁有資料庫的讀取權限,就能讀取資料庫中的所有結構定義物件。在資料庫上設定精細的存取控管機制後,具有檢視表 SELECT 權限的精細存取控管使用者,以及具有資料庫層級權限的使用者,都可以查詢檢視表。不同之處在於,精細的存取控管機制使用者不需要基礎物件的權限。

檢視畫面限制

與實際資料表相比,檢視畫面有其限制,因此不適合用於特定用途。

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

    您無法在 DML 陳述式 (INSERTUPDATEDELETE) 中使用檢視區塊。

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

  • 無法為檢視區塊建立索引。

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

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

  • 「檢視畫面」不支援 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 分以上,這項查詢仍可能因除以零錯誤而失敗。

使用檢視區塊時的查詢效能

如果查詢參照檢視區塊,效能會與該查詢相同,只是檢視區塊參照會由檢視區塊的定義取代。

檢視表適用的配額與限制

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

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

對費用的影響

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

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

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

後續步驟