本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
CREATE VIEW
在資料庫中建立檢視。檢視不會實際具體化;定義檢視的查詢會在每次查詢中參考檢視時執行。若要使用外部資料表建立檢視,請包含 WITH NO SCHEMABINDING子句。
若要建立標準檢視,您需要存取基礎資料表或基礎檢視。若要查詢標準檢視,您需要選取檢視本身的許可,但不需要選取基礎資料表的許可。如果您建立參照其他結構描述中資料表或視觀表的視觀表,或是建立參照具體化視觀表的視觀表,則需要使用權限。若要查詢近期繫結視觀表,您需要選取近期繫結視觀表本身的權限。您也應該確保延遲繫結檢視的擁有者擁有參考物件 (資料表、檢視或使用者定義函數) 的選取許可。如需近期繫結視觀表的詳細資訊,請參閱 使用須知。
所需的許可
若要使用 CREATE VIEW,需要下列其中一個許可。
若要使用 CREATE【 OR 】 REPLACE 建立檢視VIEW:
超級使用者
具有 CREATE【 】 REPLACE VIEW許可的使用者
若要使用 CREATE OR REPLACE 取代現有檢視VIEW:
超級使用者
具有 CREATE【 OR 】 REPLACE VIEW許可的使用者
檢視擁有者
如果使用者想要存取包含使用者定義函數的檢視,使用者必須擁有該函數的EXECUTE許可。
語法
CREATE [ OR REPLACE ] VIEW name [ ( column_name [, ...] ) ] AS query [ WITH NO SCHEMA BINDING ]
參數
- 或 REPLACE
-
如果有同名的檢視存在,則會取代該檢視。您只能將檢視取代為使用相同的資料欄名稱和資料類型產生一組相同資料欄的新查詢。CREATE OR 會REPLACEVIEW鎖定檢視以進行讀取和寫入,直到操作完成為止。
當檢視被替換時,其他屬性 (例如所有權和授予的權限) 會保留下來。
- name
-
檢視的名稱。如果有提供結構描述名稱 (例如
myschema.myview
),則會使用指定的結構描述建立檢視。否則,檢視會在目前結構描述中建立。檢視名稱必須與相同結構描述中的任何其他檢視或資料表名稱不同。若您指定 '#' 開頭的檢視名稱,所建立的檢視會是臨時檢視,而且只可在目前工作階段中看見。
如需有效名稱的相關資訊,請參閱 名稱與識別碼。您無法在系統資料庫 template0、template1 和 padb_harvest 或 sys:internal中建立資料表或視觀表。
- column_name
-
選用的名稱清單,將用於檢視中的資料欄。若未提供任何資料欄名稱,則會從查詢衍生資料欄名稱。單一檢視中可定義的資料欄數目上限為 1,600 個。
- query
-
評估為資料表的查詢 (以SELECT陳述式的形式)。此資料表會定義檢視中的資料欄和資料列。
- WITH 否 SCHEMA BINDING
-
此子句會指定檢視不會與底層資料庫物件繫結,像是資料表和使用者定義的函數。因此,檢視和其參考的物件之間並無相依性。即使參考的物件不存在,您仍可以建立檢視。由於沒有相依性,您可以捨棄或修改參考物件,而不會影響檢視。Amazon Redshift 在查詢檢視之前不會檢查相依姓。若要檢視近期繫結視觀表的詳細資訊,請執行 PG_GET_LATE_BINDING_VIEW_COLS 函數。
當您包含 WITH NO SCHEMABINDING子句時,SELECT陳述式中參考的資料表和檢視必須使用結構描述名稱來驗證。檢視建立時,結構描述必須存在,即使參考的資料表不存在也一樣。例如,下列陳述式會傳回錯誤。
create view myevent as select eventname from event with no schema binding;
下列陳述式會成功執行。
create view myevent as select eventname from public.event with no schema binding;
注意
您無法在檢視中進行更新、插入或刪除操作。
使用須知
近期繫結檢視
在對檢視進行查詢之前,近期繫結檢視不會檢查底層資料庫物件,像是資料表和其他檢視。因此,您可以修改或捨棄底層物件,而不會捨棄和重新建立檢視。若您捨棄底層物件,對近期繫結檢視的查詢將會失敗。若對近期繫及檢視的查詢參考底層物件中不存在的資料欄,則查詢將會失敗。
若您捨棄後再次建立近期繫結檢視的基礎資料表或檢視,則會建立具有預設存取許可的新物件。您可能需要對將查詢檢視的使用者授予基礎物件的許可。
若要建立繫結延遲檢視,請包含 WITH NO SCHEMABINDING子句。以下範例會建立不含結構描述繫結的檢視。
create view event_vw as select * from public.event with no schema binding;
select * from event_vw limit 1;
eventid | venueid | catid | dateid | eventname | starttime --------+---------+-------+--------+---------------+-------------------- 2 | 306 | 8 | 2114 | Boris Godunov | 2008-10-15 20:00:00
以下範例顯示您可以修改基礎資料表,但不重新建立檢視。
alter table event rename column eventname to title;
select * from event_vw limit 1;
eventid | venueid | catid | dateid | title | starttime --------+---------+-------+--------+---------------+-------------------- 2 | 306 | 8 | 2114 | Boris Godunov | 2008-10-15 20:00:00
您只能在近期繫結檢視中參考 Amazon Redshift Spectrum 外部資料表。近期繫結檢視的應用方式之一,就是查詢 Amazon Redshift 和 Redshift Spectrum 這兩種資料表。例如,您可以使用 UNLOAD 命令將舊資料封存至 Amazon S3。然後建立參考 Amazon S3 中資料的 Redshift Spectrum 外部資料表,並建立查詢這兩種資料表的檢視。下列範例使用 UNIONALL子句來加入 Amazon Redshift SALES
資料表和 Redshift Spectrum SPECTRUM.SALES
資料表。
create view sales_vw as select * from public.sales union all select * from spectrum.sales with no schema binding;
如需建立 Redshift Spectrum 外部資料表的相關資訊,包括 SPECTRUM.SALES
資料表,請參閱 開始使用 Amazon Redshift Spectrum。
當您從近期繫結檢視建立標準檢視時,標準檢視的定義會包含進行標準檢視時的近期繫結檢視定義。系統不會追蹤近期繫結檢視的相依性,因此不會在標準檢視中追蹤對近期繫結檢視所做的變更。
若要更新標準檢視以參考後期繫結檢視的最新定義,請執行 CREATE OR,REPLACEVIEW並使用您用來建立標準檢視的初始檢視定義。
請參閱下列範例,了解如何從近期繫結檢視建立標準檢視。
create view sales_vw_lbv as select * from public.sales with no schema binding; show view sales_vw_lbv; Show View DDL statement -------------------------------------------------------------------------------- create view sales_vw_lbv as select * from public.sales with no schema binding; (1 row) create view sales_vw as select * from sales_vw_lbv; show view sales_vw; Show View DDL statement --------------------------------------------------------------------------------------------------------------------- SELECT sales_vw_lbv.price, sales_vw_lbv."region" FROM (SELECT sales.price, sales."region" FROM sales) sales_vw_lbv; (1 row)
請注意,標準檢視的DDL陳述式中顯示的繫結後期檢視會在建立標準檢視時定義,且之後不會更新您對繫結後期檢視所做的任何變更。
範例
範例命令使用一組名為TICKIT資料庫的物件和資料範例。如需詳細資訊, 請參閱範本資料庫。
下列命令會從名為 的資料表建立名為 myevent 的檢視EVENT。
create view myevent as select eventname from event where eventname = 'LeAnn Rimes';
下列命令會從名為 的資料表建立名為 myuser 的檢視USERS。
create view myuser as select lastname from users;
下列命令會從名為 的資料表建立或取代名為 myuser 的檢視USERS。
create or replace view myuser as select lastname from users;
以下範例會建立不含結構描述繫結的檢視。
create view myevent as select eventname from public.event with no schema binding;