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 VIEW
與 CREATE 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
值。
檢視的 DEFINER
和 SQL SECURITY
子句是標準 SQL 的擴充。在標準 SQL 中,檢視是使用 SQL SECURITY DEFINER
的規則來處理的。標準規定,檢視的定義者(與檢視的綱要所有者相同)會獲得檢視的適用權限(例如,SELECT
),並且可以授予它們。MySQL 沒有綱要「“擁有者”」的概念,因此 MySQL 添加了一個子句來識別定義者。DEFINER
子句是一個擴充,其意圖是擁有標準所擁有的內容;也就是說,永久記錄誰定義了該檢視。這就是為什麼預設的 DEFINER
值是檢視建立者的帳戶。
可選的 ALGORITHM
子句是標準 SQL 的 MySQL 擴充。它會影響 MySQL 處理檢視的方式。ALGORITHM
採用三個值:MERGE
、TEMPTABLE
或 UNDEFINED
。如需更多資訊,請參閱第 27.5.2 節,「檢視處理演算法」,以及第 10.2.2.4 節,「使用合併或實體化最佳化衍生表、檢視參考和通用表運算式」。
有些檢視是可更新的。也就是說,您可以在 UPDATE
、DELETE
或 INSERT
等陳述式中使用它們,以更新基礎資料表的內容。若要使檢視可更新,檢視中的列與基礎資料表中的列之間必須存在一對一的關係。還有一些其他結構會使檢視不可更新。
檢視中的產生式資料行被視為可更新的,因為可以對其進行指派。但是,如果明確更新此類資料行,則唯一允許的值為 DEFAULT
。如需產生式資料行的相關資訊,請參閱第 15.1.20.8 節,「CREATE TABLE 和產生式資料行」。
可以為可更新的檢視指定 WITH CHECK OPTION
子句,以防止對 select_statement
中的 WHERE
子句為 true 的列進行插入或更新。
在可更新檢視的 WITH CHECK OPTION
子句中,當檢視是根據另一個檢視定義時,LOCAL
和 CASCADED
關鍵字會決定檢查測試的範圍。LOCAL
關鍵字僅將 CHECK OPTION
限制為正在定義的檢視。CASCADED
會導致也評估基礎檢視的檢查。當未給定任何關鍵字時,預設值為 CASCADED
。
如需有關可更新檢視和 WITH CHECK OPTION
子句的詳細資訊,請參閱第 27.5.3 節,「可更新和可插入的檢視」,以及第 27.5.4 節,「檢視 WITH CHECK OPTION 子句」。