Une vue est une table virtuelle définie par une requête SQL. Elle permet d'encapsuler une logique de requête complexe afin que d'autres utilisateurs ou applications puissent exécuter une simple instruction SELECT sur la vue, sans avoir à rédiger eux-mêmes la requête sous-jacente.
Par exemple, si votre entrepôt de données stocke des enregistrements de commandes et que vous souhaitez permettre à votre équipe analytique d'accéder aux résumés des revenus sans exposer les détails bruts des transactions, créez une vue qui joint et agrège préalablement les tables pertinentes. L'équipe analytique interroge la vue tandis que les tables sous-jacentes restent protégées.
Hologres prend en charge la création de vues basées sur des tables internes, des tables externes ou d'autres vues, y compris des vues fédérées qui combinent des données issues de tables internes et externes.
Notes d'utilisation
Règles de modification des données
| Type de vue | Modification des données possible ? |
|---|---|
| Vue mono-table | Oui — les modifications apportées à la vue mettent à jour la table de base, et les modifications de la table de base sont reflétées dans la vue. Restreignez l'accès en écriture à la vue pour éviter toute modification involontaire. |
| Vue multi-tables | Non — les données contenues dans les vues multi-tables sont en lecture seule. |
Vues inter-schémas et SLPM
Si le modèle d'autorisations au niveau du schéma (SLPM) est activé sur une base de données, ne créez pas de vues référençant des tables situées dans différents schémas. Étant donné que des autorisations distinctes sont requises pour chaque schéma dans le cadre du SLPM, il est impossible d'interroger des vues inter-schémas.
Autorisation des vues
Hologres applique le mode « security definer » de PostgreSQL pour l'autorisation des vues. Pour qu'un utilisateur puisse interroger une vue, les deux conditions suivantes doivent être remplies :
| Rôle | Autorisation requise |
|---|---|
| Créateur de la vue (Utilisateur A) | SELECT sur la table de base |
| Consommateur de la vue (Utilisateur B) | SELECT sur la vue |
L'utilisateur B n'a pas besoin d'un accès direct à la table de base, mais uniquement à la vue. Les autorisations du créateur de la vue sont utilisées lors de l'exécution de celle-ci.
Syntaxe
CREATE VIEW <view_name> AS
SELECT column1, column2, ...
FROM table_name
WHERE [condition];
<view_name> correspond au nom de la vue. L'instruction SELECT définit la requête représentée par la vue.
Exemples
Créer une vue basée sur une table interne
-
Créez une table interne et insérez des exemples de données :
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); -
Créez une vue sur la table et interrogez-la :
CREATE VIEW holo_view AS SELECT * FROM holo_test; SELECT * FROM holo_view;Résultat attendu :
amount | rate --------+------- 12.12 | 13.13 14.14 | 15.15 16.16 | 17.17 17.10 | 17.00 18.01 | 19.00 (5 rows)
Créer une vue basée sur une table externe
-
Créez une table externe mappée à une table MaxCompute (ODPS) :
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; -
Créez une vue sur la table externe et interrogez-la :
CREATE VIEW foreign_view AS SELECT * FROM holo_foreign_test; SELECT * FROM foreign_view LIMIT 2;Résultat attendu :
amount | rate --------+------- 12.12 | 13.13 14.14 | 15.15
Créer une vue fédérée
Une vue fédérée unifie les données provenant de tables internes et de tables externes en un seul objet interrogeable. Cette approche s'avère utile lorsqu'une partie de vos données réside dans le stockage interne de Hologres et le reste dans une source externe telle que MaxCompute : vous pouvez interroger les deux sources via une seule vue sans déplacer les données. La vue fédérée utilise l'opérateur UNION ALL pour combiner les deux sources.
CREATE VIEW view1 AS
SELECT * FROM holo_view
UNION ALL
SELECT * FROM foreign_view;
SELECT * FROM view1;
Résultat attendu :
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)
Autres opérations
Renommer une vue
Le renommage des vues nécessite Hologres V2.1.18 ou une version ultérieure.
ALTER VIEW <view_name_1> RENAME TO <view_name_2>;
Supprimer une vue
DROP VIEW <view_name>;
Lister toutes les vues
Exécutez la requête SQL suivante pour lister toutes les vues du schéma actuel :
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;
Si vous utilisez un client psql, exécutez plutôt la commande \dv.
Consulter la DDL d'une vue
CREATE EXTENSION hg_toolkit;
SELECT hg_dump_script('<view_name>');