Skip to content

Vues

  • Les vues sont essentiellement des tables virtuelles
  • Elles sont une couche au-dessus d’autres tables
  • Avec le contrôle d’accès, elles peuvent être utilisées pour assurer différents niveaux de confidentialité et de sécurité
  • Par exemple, le département des ressources humaines a généralement besoin de connaître les numéros d’assurance sociale (NAS) de leurs employés pour les déclarer aux différents gouvernements pour les impôts, etc.
  • Mais les services informatiques (sauf peut-être les DBA de haut niveau), le marketing, etc. ne devraient pas avoir accès aux NAS
  • L’accès à la table de base des employés, avec les NAS, peut être accordé à certains employés (ou à certains rôles si l’on utilise le contrôle d’accès basé sur les rôles)
  • Une vue au-dessus de la table des employés peut être créée sans les NAS, et l’accès à d’autres employés peut être accordé sur la vue
drop schema if exists company cascade;
create schema company;
set search_path to company;
create table employee_priv
(
    eid   integer generated always as identity primary key,
    sin   CHAR(9) not null unique,
    name  text    not null,
    phone text
);
insert into employee_priv(sin, name, phone)
values ('123456789', 'Denis', '123-456-7890'),
       ('987654321', 'Jane', '987-654-3210');
select *
from employee_priv;
create or replace view employee AS
select eid, name, phone
from employee_priv;
select *
from employee;
--drop role hr;
--drop role itsupport;
create role hr;
create role itsupport;
grant select, insert, update, delete on employee_priv to hr;
grant select on employee to itsupport;
  • La création d’utilisateurs et de rôles n’est pas complètement standardisée dans tous les SGBDR
  • Chaque SGBDR devrait avoir les commandes SQL grant et revoke
  • PostgreSQL - create user
  • PostgreSQL - alter user
  • PostgreSQL - grant
  • Les vues peuvent être créées sur des requêtes couramment utilisées, souvent incluant des jointures, pour simplifier l’écriture d’autres requêtes
set search_path to university;
create or replace view studentcourse as
select s.sid,
       s.name as student_name,
       c.code,
       c.name as course_name,
       o.semester,
       o.year
from student s
         left join enrollment e on s.sid = e.sid
         inner join offering o on e.oid = o.oid
         inner join course c on o.cid = c.cid;
select *
from studentcourse;
  • Nous pouvons restreindre les lignes de la vue à un étudiant spécifique, pour un semestre et une année spécifiques
  • cela pourrait être utile lors de la création d’horaires
select *
from studentcourse
where sid = 3
  and semester = 'W'
  and year = 2020;

Indépendance logique des données

  • Les vues peuvent également être utilisées pour minimiser l’impact des changements de schéma dans la base de données
  • Supposons qu’un schéma de table doive être modifié, éventuellement parce qu’une table doit être décomposée pour réduire la redondance en raison d’une dépendance fonctionnelle précédemment inconnue
  • Ensuite, toutes les requêtes utilisant cette table doivent être mises à jour, ce qui pourrait être difficile à faire
  • Une vue avec le même nom et les mêmes colonnes peut être créée pour remplacer l’ancienne table
  • cette vue serait définie sur les nouvelles tables remplaçant l’ancienne table

Les vues sont-elles modifiables ?

  • La meilleure réponse est peut-être, mais probablement pas (du moins pas en général)
  • Si nous voulons mettre à jour le numéro de téléphone d’un employé, nous pourrions probablement le faire via la vue, car la vue a une correspondance directe avec exactement 1 table, moins la colonne NAS
  • la mise à jour peut être redirigée vers la table employee_priv
  • Mais nous ne pouvons pas insérer une nouvelle ligne dans la vue des employés car la table employee_priv a la colonne NAS, qui ne peut pas être null
  • de plus, comme elle a la contrainte unique, nous ne pouvons pas la définir sur une valeur par défaut
  • en fait, nous pourrions la définir sur une valeur par défaut pour au plus 1 employé
  • De même, essayer de mettre à jour la vue studentcourse pourrait être compliqué car elle provient de la jointure de 4 tables
  • mettre à jour 1 ligne dans studentcourse pourrait signifier que nous devons modifier plusieurs lignes dans 1 ou plusieurs tables sous-jacentes
  • si nous essayons de changer l’inscription d’un étudiant à une offre de cours via la vue, nous devrons mettre à jour la table d’inscription, qui n’apparaît pas directement dans la vue (ses colonnes ne sont pas sélectionnées par la requête de la vue)
  • même genre de problème pour l’insertion de lignes
  • cela pourrait être possible dans certains cas, mais il n’y a pas de moyen universel de le faire
  • Il y a des problèmes similaires avec la suppression de lignes via une vue
  • c’est possible dans certains cas, mais pas tous