資料函式庫檢視是根據 SQL 查詢結果建立的虛擬表格,簡化複雜查詢的同時,也能提升資料安全性。透過檢視,開發者可以控制資料的存取許可權,隱藏底層資料表的複雜結構,並根據不同使用者角色提供客製化資料檢視。安全檢視則更進一步,根據使用者身份或角色限制資料存取,有效保護敏感資訊。此外,物化檢視能將查詢結果儲存至實體表格,並自動更新,大幅提升查詢效能,適合用於頻繁存取的彙總資料。
檢視(View)的基本概念與應用
檢視(View)在資料函式倉管理系統中是一種虛擬的表格,它是根據 SQL 查詢結果所建立的。檢視可以簡化複雜的查詢,提供資料的安全性,並且使得資料函式庫設計更加模組化。
建立檢視
在 Snowflake 中,檢視的建立使用 CREATE VIEW 陳述式。檢視可以根據簡單的查詢,也可以包含複雜的查詢邏輯,如聯接(JOIN)、分組(GROUP BY)和篩選條件(WHERE、HAVING)等。
簡單檢視範例
CREATE VIEW person_vw (fname, lname, dob, eyes)
AS
SELECT p_first_name, p_last_name, p_date_of_birth, p_eyes
FROM person;
執行 DESCRIBE 命令可以檢視檢視的結構:
PUBLIC> DESCRIBE person_vw;
+
---
-
---
+
---
-
---
-
---
--+
---
-
---
-+
---
-
---
+
---
-
---
--+...
| name | type | kind | null? | default |...
|
---
-
---
+
---
-
---
-
---
--+
---
-
---
-+
---
-
---
+
---
-
---
--+...
| FNAME | VARCHAR(50) | COLUMN | Y | NULL |...
| LNAME | VARCHAR(50) | COLUMN | Y | NULL |...
| DOB | DATE | COLUMN | Y | NULL |...
| EYES | VARCHAR(10) | COLUMN | Y | NULL |...
+
---
-
---
+
---
-
---
-
---
--+
---
-
---
-+
---
-
---
+
---
-
---
--+...
複雜檢視範例
以下是一個結合多個表格、包含篩選條件和分組的檢視範例:
CREATE VIEW big_spenders_1998_vw
(custkey, cust_name, total_order_dollars)
AS
SELECT o_custkey, c.c_name, SUM(o_totalprice)
FROM orders AS o
INNER JOIN customer AS c
ON o.o_custkey = c.c_custkey
WHERE 1998 = DATE_PART(year, o.o_orderdate)
GROUP BY o.o_custkey, c.c_name
HAVING SUM(o.o_totalprice) >= 500000;
內容解密:
CREATE VIEW陳述式用於建立一個名為big_spenders_1998_vw的檢視。- 該檢視包含三個欄位:
custkey、cust_name和total_order_dollars。 - 查詢根據
orders和customer兩個表格,透過o_custkey和c_custkey進行內聯接。 WHERE子句篩選出訂單日期為 1998 年的記錄。GROUP BY子句按客戶鍵和客戶名稱進行分組。HAVING子句進一步篩選出總訂單金額大於或等於 500,000 的客戶。
使用檢視
檢視可以像普通表格一樣在查詢中使用,包括聯接、子查詢和公用表表達式(CTE)等。
聯接檢視範例
SELECT p.fname, p.lname, e.empid
FROM person_vw AS p
INNER JOIN employee_vw AS e
ON e.emp_name = CONCAT(p.fname, ' ', p.lname);
內容解密:
- 該查詢聯接了
person_vw和employee_vw兩個檢視。 - 聯接條件是員工名稱與人員姓名的拼接結果相匹配。
- 查詢結果包含人員的名字、姓氏和員工ID。
為什麼使用檢視?
檢視提供了多種好處,包括簡化複雜查詢、提高資料安全性和增強資料函式庫設計的模組化。
資料安全
透過檢視,可以限制使用者對敏感資料的存取。例如,可以建立一個檢視,該檢視只包含員工的薪資範圍,而不包含實際的薪資數字,從而對非授權使用者隱藏敏感資訊。
範例:建立員工薪資範圍檢視
- 首先,為
Employee表新增一個salary欄位。 - 然後,更新員工的薪資資料。
- 建立一個新的檢視
employee_manager_vw,該檢視根據需要提供員工的薪資範圍。
ALTER TABLE employee ADD salary NUMBER(7,0);
UPDATE employee
SET salary = UNIFORM(50000, 200000, RANDOM());
CREATE VIEW employee_manager_vw
AS
SELECT empid, emp_name,
CASE
WHEN salary < 80000 THEN 'Low'
WHEN salary BETWEEN 80000 AND 150000 THEN 'Medium'
ELSE 'High'
END AS salary_range
FROM employee;
內容解密:
ALTER TABLE陳述式為employee表增加了一個新的salary欄位。UPDATE陳述式使用UNIFORM函式為每位員工生成一個隨機薪資。- 新的檢視
employee_manager_vw根據員工的薪資範圍提供了一個分類別欄位salary_range。
為什麼使用檢視(Views)?
在資料函式倉管理中,檢視是一種虛擬的表格,根據 SQL 查詢的結果集。檢視可以簡化複雜的查詢,提供資料的安全性,並且能夠根據不同的使用者角色提供不同的資料存取許可權。
建立和管理檢視
在前面的章節中,我們已經瞭解瞭如何建立檢視。例如,建立一個名為 employee_manager_vw 的檢視,用於顯示員工的基本資訊和薪水範圍:
CREATE VIEW employee_manager_vw
(empid, emp_name, mgr_empid, salary_range)
AS
SELECT empid, emp_name, mgr_empid,
CASE
WHEN salary <= 75000 THEN 'Low'
WHEN salary <= 125000 THEN 'Medium'
ELSE 'High'
END AS salary_range
FROM employee;
內容解密:
CREATE VIEW陳述式用於建立一個新的檢視。employee_manager_vw是檢視的名稱,後面括號內的欄位名稱對應於檢視將要顯示的欄位。AS SELECT子句定義了檢視的查詢邏輯,從employee表格中選取所需的欄位,並使用CASE陳述式計算salary_range。salary_range根據salary的值被分為 ‘Low’、‘Medium’ 和 ‘High’ 三個等級。
查詢 employee_manager_vw 檢視的結果如下:
+
---
-
---
+
---
-
---
-
---
-
---
-+
---
-
---
-
---
+
---
-
---
-
---
---
+
| EMPID | EMP_NAME | MGR_EMPID | SALARY_RANGE |
|
---
-
---
+
---
-
---
-
---
-
---
-+
---
-
---
-
---
|
---
-
---
-
---
---
|
| 1001 | Bob Smith | NULL | Low |
| 1002 | Susan Jackson | 1001 | Medium |
| 1003 | Greg Carpenter | 1001 | Medium |
| 1004 | Robert Butler | 1002 | Low |
| 1005 | Kim Josephs | 1003 | High |
| 1006 | John Tyler | 1004 | High |
| 9999 | Tim Traveler | 1006 | Low |
| 1007 | John Sanford | 1002 | Low |
+
---
-
---
+
---
-
---
-
---
-
---
-+
---
-
---
-
---
+
---
-
---
-
---
---
+
安全檢視(Secure Views)
Snowflake 提供了一種特殊型別的檢視,稱為安全檢視,用於根據當前使用者或角色限制資料的存取。例如,我們可以建立一個名為 my_employees 的安全檢視,用於顯示當前使用者有權存取的員薪水訊:
CREATE SECURE VIEW my_employees AS
SELECT e.empid, e.emp_name, d.dept_name
FROM employee e
INNER JOIN empl_dept ed ON e.empid = ed.empid
INNER JOIN department d ON ed.dept_id = d.dept_id
WHERE d.auth_username = CURRENT_USER();
內容解密:
CREATE SECURE VIEW陳述式用於建立一個安全檢視。my_employees是安全檢視的名稱。- 安全檢視的查詢邏輯與普通檢視類別似,但它根據
CURRENT_USER()函式傳回的當前使用者名稱過濾資料。 - 這確保了只有授權的使用者才能看到與其相關的資料。
查詢 my_employees 安全檢視的結果如下:
+
---
-
---
+
---
-
---
-
---
-
---
+
---
-
---
-
---
+
| EMPID | EMP_NAME | DEPT_NAME |
|
---
-
---
+
---
-
---
-
---
-
---
+
---
-
---
-
---
|
| 1002 | Susan Jackson | FINANCE |
| 1005 | Kim Josephs | FINANCE |
+
---
-
---
+
---
-
---
-
---
-
---
+
---
-
---
-
---
+
此範例展示瞭如何使用檢視和安全檢視來控制資料的存取許可權,從而提高資料的安全性。
圖表翻譯:
以下 Plantuml 圖表展示了員工、部門和安全檢視之間的關係:
@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333
title 圖表翻譯:
rectangle "empid" as node1
rectangle "dept_id" as node2
rectangle "auth_username" as node3
rectangle "access" as node4
node1 --> node2
node2 --> node3
node3 --> node4
@enduml
圖表翻譯: 此圖表展示了員工表格(Employee)與部門表格(Department)透過員工部門關聯表格(Empl_Dept)進行連線。安全檢視(My_Employees Secure View)根據當前使用者的授權使用者名稱(auth_username)限制對員薪水料的存取。只有當部門表格中的 auth_username 與當前使用者相符時,相關員工的資料才會出現在安全檢視中。
為何使用檢視(Views)?
在資料函式倉管理中,檢視是一種虛擬的表格,它根據查詢結果而建立。檢視可以簡化複雜的查詢,提供資料的安全性,並隱藏底層資料表的複雜性。
安全檢視(Secure Views)
安全檢視是一種特殊的檢視,它限制了對資料的存取,只有具有特定角色或使用者名稱的使用者才能存取檢視中的資料。例如,可以建立一個安全檢視 my_employees,它根據當前使用者的使用者名稱來顯示不同的資料。
create or replace secure view my_employees(
empid,
emp_name,
dept_name
) as
select e.empid, e.emp_name, d.dept_name
from employee e
inner join empl_dept ed on e.empid = ed.empid
inner join department d on ed.dept_id = d.dept_id
where d.auth_username = current_user();
內容解密:
create or replace secure view:建立或替換一個安全檢視。my_employees:檢視的名稱。empid, emp_name, dept_name:檢視中的欄位名稱。select陳述式:定義了檢視中的資料來源和過濾條件。where d.auth_username = current_user():根據當前使用者的使用者名稱來過濾資料。
使用安全檢視可以限制對資料的存取,並且只有具有相同角色的使用者才能檢索檢視的定義。
資料聚合(Data Aggregation)
資料分析和報告通常需要聚合資料。與其提供使用者直接存取資料表,不如建立檢視來使資料看起來像是已經預先聚合好了。例如,可以建立一個檢視 yearly_part_sales_vw 來顯示每年的零件銷售資料。
create view yearly_part_sales_vw
as
with part_supply as (
select p.p_partkey as partkey,
p.p_name as part_name,
sum(ps.ps_availqty) as avail_qty
from part p
inner join partsupp ps on p.p_partkey = ps.ps_partkey
group by p.p_partkey, p.p_name
),
part_sales as (
select date_part(year, o.o_orderdate) as order_year,
li.l_partkey as partkey,
count(*) as sales_qty,
max(li.l_shipdate - o.o_orderdate) max_backlog_days
from orders o
inner join lineitem li on o.o_orderkey = li.l_orderkey
group by date_part(year, o.o_orderdate), li.l_partkey
)
select p_sply.partkey,
p_sply.part_name,
p_sply.avail_qty,
p_sale.order_year,
p_sale.sales_qty,
p_sale.max_backlog_days
from part_supply p_sply
inner join part_sales p_sale on p_sply.partkey = p_sale.partkey;
內容解密:
create view:建立一個檢視。yearly_part_sales_vw:檢視的名稱。with子句:定義了兩個臨時表part_supply和part_sales。part_supply:計算每個零件的可用數量。part_sales:計算每年的零件銷售數量和最大延遲天數。- 最終的
select陳述式:將part_supply和part_sales的結果合併起來。
使用這個檢視,使用者可以輕鬆地查詢每年的零件銷售資料。
物化檢視(Materialized Views)
物化檢視是一種特殊的檢視,它將查詢結果儲存在物理表中,並且會自動更新。建立物化檢視可以使用 create materialized view 陳述式。
create materialized view yearly_part_sales_vw
as
-- 與上述 yearly_part_sales_vw 檢視相同的查詢陳述式
內容解密:
create materialized view:建立一個物化檢視。- 物化檢視會將查詢結果儲存在物理表中,並且會自動更新。
使用物化檢視可以提高查詢效能,但是會佔用額外的儲存空間和計算資源。
隱藏複雜性(Hiding Complexity)
檢視還可以用來隱藏複雜的計算或資料關係。例如,可以建立一個檢視 order_calculation_vw 來計算訂單的總金額和銷售稅。
create view order_calculation_vw
as
select o.o_orderkey,
sum((li.l_extendedprice * (1 - li.l_discount)) * li.l_quantity) order_total,
sum((li.l_extendedprice * (1 - li.l_discount)) * li.l_quantity * li.l_tax) state_sales_tax
from orders o
inner join lineitem li on o.o_orderkey = li.l_orderkey
group by o.o_orderkey;
內容解密:
create view:建立一個檢視。order_calculation_vw:檢視的名稱。select陳述式:計算訂單的總金額和銷售稅。- 使用了多個欄位和計算公式來得出最終結果。
使用這個檢視,業務部門可以輕鬆地查詢訂單的總金額和銷售稅,而無需瞭解底層的計算邏輯。