文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  CREATE VIEW 陳述式

15.1.23 CREATE VIEW 陳述式

CREATE
    [OR REPLACE]
    [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    [DEFINER = user]
    [SQL SECURITY { DEFINER | INVOKER }]
    VIEW view_name [(column_list)]
    AS select_statement
    [WITH [CASCADED | LOCAL] CHECK OPTION]

CREATE VIEW 陳述式會建立新的檢視表,如果給定 OR REPLACE 子句,則會取代現有的檢視表。如果檢視表不存在,CREATE OR REPLACE VIEWCREATE VIEW 相同。如果檢視表確實存在,CREATE OR REPLACE VIEW 會取代它。

有關檢視表使用限制的資訊,請參閱第 27.9 節,「檢視表的限制」

CREATE VIEW test.v AS SELECT * FROM t;

CREATE VIEW v_today (today) AS SELECT CURRENT_DATE;

mysql> CREATE TABLE t (qty INT, price INT);
mysql> INSERT INTO t VALUES(3, 50);
mysql> CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;
mysql> SELECT * FROM v;
+------+-------+-------+
| qty  | price | value |
+------+-------+-------+
|    3 |    50 |   150 |
+------+-------+-------+

mysql> CREATE VIEW v (mycol) AS SELECT 'abc';
Query OK, 0 rows affected (0.01 sec)

mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT "mycol" FROM v;
+-------+
| mycol |
+-------+
| mycol |
+-------+
1 row in set (0.01 sec)

mysql> SET sql_mode = 'ANSI_QUOTES';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT "mycol" FROM v;
+-------+
| mycol |
+-------+
| abc   |
+-------+
1 row in set (0.00 sec)

  • 在檢視定義時,檢視建立者必須擁有使用檢視存取的頂層物件所需的權限。例如,如果檢視定義參照了資料表欄位,建立者必須對定義的選取清單中的每個欄位都具有某種權限,並且對定義中其他地方使用的每個欄位都具有 SELECT 權限。如果定義參照了儲存函式,則只能檢查呼叫該函式所需的權限。在函式執行時所需的權限只能在執行時檢查:對於不同的呼叫,函式內可能會採用不同的執行路徑。

  • 參考檢視的使用者必須擁有適當的權限才能存取它(SELECT 用於從中選取資料,INSERT 用於將資料插入其中,依此類推。)

  • 當檢視被參考時,檢視存取物件的權限會根據檢視的 DEFINER 帳戶或呼叫者所持有的權限進行檢查,這取決於 SQL SECURITY 特性是 DEFINER 還是 INVOKER

  • 如果參考檢視導致執行儲存函式,則在函式內執行的陳述式的權限檢查取決於函式的 SQL SECURITY 特性是 DEFINER 還是 INVOKER。如果安全性特性是 DEFINER,則函式會以 DEFINER 帳戶的權限執行。如果特性是 INVOKER,則函式會以檢視的 SQL SECURITY 特性所決定的權限執行。

範例:檢視可能依賴於儲存函式,而該函式可能會呼叫其他儲存常式。例如,以下檢視會呼叫儲存函式 f()

CREATE VIEW v AS SELECT * FROM t WHERE t.id = f(t.name);

假設 f() 包含如下陳述式

IF name IS NULL then
  CALL p1();
ELSE
  CALL p2();
END IF;

f() 執行時,需要檢查在 f() 內執行陳述式所需的權限。這可能意味著需要 p1()p2() 的權限,具體取決於 f() 內的執行路徑。這些權限必須在執行時檢查,並且擁有權限的使用者取決於檢視 v 和函式 f()SQL SECURITY 值。

檢視的 DEFINERSQL SECURITY 子句是標準 SQL 的擴充。在標準 SQL 中,檢視是使用 SQL SECURITY DEFINER 的規則來處理的。標準規定,檢視的定義者(與檢視的綱要所有者相同)會獲得檢視的適用權限(例如,SELECT),並且可以授予它們。MySQL 沒有綱要「擁有者」的概念,因此 MySQL 添加了一個子句來識別定義者。DEFINER 子句是一個擴充,其意圖是擁有標準所擁有的內容;也就是說,永久記錄誰定義了該檢視。這就是為什麼預設的 DEFINER 值是檢視建立者的帳戶。

可選的 ALGORITHM 子句是標準 SQL 的 MySQL 擴充。它會影響 MySQL 處理檢視的方式。ALGORITHM 採用三個值:MERGETEMPTABLEUNDEFINED。如需更多資訊,請參閱第 27.5.2 節,「檢視處理演算法」,以及第 10.2.2.4 節,「使用合併或實體化最佳化衍生表、檢視參考和通用表運算式」

有些檢視是可更新的。也就是說,您可以在 UPDATEDELETEINSERT 等陳述式中使用它們,以更新基礎資料表的內容。若要使檢視可更新,檢視中的列與基礎資料表中的列之間必須存在一對一的關係。還有一些其他結構會使檢視不可更新。

檢視中的產生式資料行被視為可更新的,因為可以對其進行指派。但是,如果明確更新此類資料行,則唯一允許的值為 DEFAULT。如需產生式資料行的相關資訊,請參閱第 15.1.20.8 節,「CREATE TABLE 和產生式資料行」

可以為可更新的檢視指定 WITH CHECK OPTION 子句,以防止對 select_statement 中的 WHERE 子句為 true 的列進行插入或更新。

在可更新檢視的 WITH CHECK OPTION 子句中,當檢視是根據另一個檢視定義時,LOCALCASCADED 關鍵字會決定檢查測試的範圍。LOCAL 關鍵字僅將 CHECK OPTION 限制為正在定義的檢視。CASCADED 會導致也評估基礎檢視的檢查。當未給定任何關鍵字時,預設值為 CASCADED

如需有關可更新檢視和 WITH CHECK OPTION 子句的詳細資訊,請參閱第 27.5.3 節,「可更新和可插入的檢視」,以及第 27.5.4 節,「檢視 WITH CHECK OPTION 子句」