ビューは、SQL クエリによってコンテンツが定義される仮想テーブルです。ビューは、複雑なクエリロジックをカプセル化できます。このように、単純なビューをクエリして複雑な結果セットを取得できます。Hologres では、1 つ以上の内部テーブル、外部テーブル、またはビューに基づいてビューを作成できます。このトピックでは、Hologres でビューを作成する方法について説明します。
使用上の注意
ビューを作成およびクエリする場合は、次の点に注意してください。
データベースに対してスキーマレベルの権限モデル(SLPM)を有効にし、データベース内のスキーマをまたがる複数のテーブルを参照するビューを作成した場合、異なるスキーマには異なる権限が必要となるため、ビューをクエリすることはできません。そのため、SLPM が有効になっているデータベース内のスキーマをまたがるテーブルを参照するビューは作成しないことをお勧めします。
単一のテーブルに基づいてビューを作成し、ビューのデータを変更すると、ソーステーブルのデータが自動的に更新されます。ソーステーブルのデータを変更すると、ビューのデータも更新されます。単一テーブルビューを使用する場合は、ソーステーブルのデータが変更されず、ビジネスに影響が出ないように、ビューのデータを慎重に変更することをお勧めします。
複数のテーブルに基づいてビューを作成した場合、ビューのデータは変更できません。
Hologres は PostgreSQL エコシステムと互換性があり、ビューの権限付与には security definer モードを使用します。ユーザー B がユーザー A によって作成されたビューをクエリするには、次の両方の条件を満たす必要があります。
ユーザー A は、ビューのベーステーブルに対する SELECT 権限を持っている必要があります。
ユーザー B は、ビューに対する SELECT 権限を持っている必要があります。
構文
次の構文を使用してビューを作成できます。
CREATE VIEW <view_name> AS
SELECT column1, column2.....
FROM table_name
WHERE [condition];view_name はビューの名前です。SELECT ... 文は、ビューを定義するクエリです。
例
内部テーブルに基づいてビューを作成する
内部テーブルを作成します。ステートメントの例:
CREATE TABLE holo_test ( amount decimal(10, 2), rate decimal(10, 2) ); INSERT INTO holo_test VALUES (12.12,13.13), (14.14,15.15), (16.16,17.17), (17.1,17), (18.01,19);内部テーブルに基づいてビューを作成し、テーブルデータをクエリします。ステートメントの例:
CREATE VIEW holo_view AS SELECT * FROM holo_test; SELECT * FROM holo_view; amount | rate --------+------- 12.12 | 13.13 14.14 | 15.15 16.16 | 17.17 17.10 | 17.00 18.01 | 19.00 (5 rows)
外部テーブルに基づいてビューを作成する
外部テーブルを作成します。ステートメントの例:
CREATE FOREIGN TABLE IF NOT EXISTS holo_foreign_test ( amount decimal(10, 2), rate decimal(10, 2)) SERVER odps_server OPTIONS(project_name '<projectname>', table_name '<odps_name>') ); SELECT * FROM holo_foreign_test LIMIT 2;外部テーブルに基づいてビューを作成し、テーブルデータをクエリします。ステートメントの例:
CREATE VIEW foreign_view AS SELECT * FROM holo_foreign_test; SELECT * FROM foreign_view LIMIT 2; amount | rate --------+------- 12.12 | 13.13 14.14 | 15.15
内部テーブルと外部テーブルに基づいてフェデレーテッドビューを作成する
内部テーブルと外部テーブルに基づいてフェデレーテッドビューを作成し、テーブルデータをクエリします。ステートメントの例:
CREATE VIEW view1 AS SELECT * FROM holo_view UNION ALL SELECT * FROM foreign_view;
SELECT * FROM view1;
amount | rate
--------+-------
12.12 | 13.13
14.14 | 15.15
16.16 | 17.17
17.1 | 17
18.01 | 19
12.12 | 13.13
14.14 | 15.15
16.16 | 17.17
17.10 | 17.00
18.01 | 19.00
12.12 | 13.13
14.14 | 15.15
16.16 | 17.17
17.1 | 17
18.01 | 19
12.12 | 13.13
14.14 | 15.15
16.16 | 17.17
17.1 | 17
18.01 | 19
(20 rows)その他の操作
ビューの変更
Hologres V2.1.18 以降では、ビュー名を変更できます。次の構文を使用します。
ALTER VIEW <view_name_1> RENAME TO <view_name_2>;ビューを削除する
次の構文を使用してビューを削除できます。
DROP VIEW <view_name>;すべてのビューとビューの DDL ステートメントをクエリする
次のコマンドを実行して、すべてのビューを表示します。psql クライアントを使用している場合は、
\dvコマンドを実行することもできます。-- SQL コマンド SELECT n.nspname AS "Schema", c.relname AS "Name", CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'm' THEN 'materialized view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' WHEN 'f' THEN 'foreign table' WHEN 'p' THEN 'table' WHEN 'I' THEN 'index' END AS "Type", pg_catalog.pg_get_userbyid(c.relowner) AS "Owner" FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relkind IN ('v','') AND n.nspname <> 'pg_catalog' AND n.nspname <> 'information_schema' AND n.nspname !~ '^pg_toast' AND pg_catalog.pg_table_is_visible(c.oid) ORDER BY 1,2;次の構文を使用して、ビューの DDL ステートメントをクエリできます。
CREATE EXTENSION hg_toolkit; SELECT hg_dump_script('<viewname>');