# Les vues et contraintes

Voici un exemple de vue qui provient d'un exercice de labo: 

```sql
-- La vue s'appelle "chateau" et va lister tous les biens de type chateau
CREATE VIEW chateau AS

-- Ici on peut mettre la requête qui permet de lister tous les biens de type chateau
SELECT b.* 
FROM Bien b 
JOIN CATEGORIE_BIEN cb ON cb.ID_CATBIEN = b.ID_CATBIEN 
WHERE cb.DESCRIPTION = 'Château'

-- Cette ligne indique que si on veut ajouter un élément dans la vue, elle doit respecter la condition de la requête
WITH CHECK OPTION;
-- On aurait aussi pu utiliser "WITH READ ONLY" si on veut empécher d'y insérer des données
```

Ainsi ici, on a créé un genre de table spéciale appelée "château" que l'on peut ensuite accorder l'accès à un utilisateur. Ainsi, cet utilisateur ne pourra insérer que des châteaux dans la base de donnée et ne pourra voir que la liste des châteaux et rien d'autre.

> Attention, pour qu'une vue soit modifiable, il faut qu'elle soit la plus minimale possible (sans jointures, ni group by, ni opérations ensemblistes)

## Contraintes 
On peut aussi ajouter des contraintes directement sur la table, par exemple une clé étrangère ou encore la vérification d'une condition.

```sql
-- Modification de la table Alerter pour y ajouter une contrainte que statut ne peut être que L ou N
ALTER TABLE Alerter 
  -- La condition doit toujours être en parenthèse
	ADD CONSTRAINT statutRestriction CHECK (STATUT IN ('L', 'N'));
```