DDL - Vistes i DML
Una Vista simplifica l'accés a certes dades per alguns usuaris, però, algunes vistes també permeten als usuaris realitzar modificacions en les taules adjacents.
Tot DBA ha de mantenir la integritat de la BD, i per tant, pot posar certes restriccions en determinades vistes.
En vistes simples podem realitzar operacions de INSERT, UPDATE i DELETE, però, tots els canvis són possibles?
La vista creada a continuació, view_dept_50, s'ha creat pels caps del departament 50.
La intenció d'aquesta vista és permetre als caps del departament 50 veure la informació dels seus empleats.
CREATE VIEW view_dept50 AS
SELECT department_id, employee_id, first_name, last_name, salary
FROM copy_employees
WHERE department_id = 50;
SELECT * FROM view_dept50;
Possible sortida a la SELECT anterior
+---------------+-------------+------------+-----------+---------+
| department_id | employee_id | first_name | last_name | salary |
+---------------+-------------+------------+-----------+---------+
| 50 | 124 | Kevin | Mourgos | 5800.00 |
| 50 | 141 | Trenna | Rajs | 3500.00 |
| 50 | 142 | Curtis | Davies | 3100.00 |
| 50 | 143 | Randall | Matos | 2600.00 |
| 50 | 144 | Peter | Vargas | 2500.00 |
+---------------+-------------+------------+-----------+---------+
A la vista anterior podem INSERIR, ACTUALITZAR i SUPRIMIR informació de totes les files de la vista, fins i tot encara que el resultat sigui que una fila ja no formi parte de la vista; per exemple, si modifiquem el department_id.
Potser això no és el que el DBA volia al crear la vista.
Per a controlar l'accés a les dades, podem afegir la opció WITH CHECK OPTION a la instrucció CREATE VIEW.
Vistes amb WITH CHECK OPTION
Podem modificar el departament d'un empleat amb la vista i aquest no apareixerà més a la vista. El sistema ens deixa.
START TRANSACTION;
UPDATE view_dept50 SET department_id = 90
WHERE employee_id = 124;
SELECT * FROM view_dept50;
SELECT * FROM employees WHERE employee_id = 124;
ROLLBACK;
+-------------+-----------+----------+---------+-------+
|department_id|employee_id|first_name|last_name|salary |
+-------------+-----------+----------+---------+-------+
| 50| 141|Trenna | Rajs |3500.00|
| 50| 142|Curtis | Davies |3100.00|
| 50| 143|Randall | Matos |2600.00|
| 50| 144|Peter | Vargas |2500.00|
+-------------+-----------+----------+---------+-------+
+-------------+-----------+----------+---------+-------+---+
|department_id|employee_id|first_name|last_name|salary |***+
+-------------+-----------+----------+---------+-------+---+
| 90| 124|Kevin |Mourgos |5800.00|***+
+-------------+-----------+----------+---------+-------+---+
Hem pogut modificar el codi de departament de l'empleat i aquest ha desaparegut de la vista però no de la taula.
I si creem la vista amb la opció WITH CHECK OPTION?
CREATE OR REPLACE VIEW view_dept50 AS
SELECT department_id, employee_id, first_name, last_name, salary
FROM copy_employees
WHERE department_id = 50
WITH CHECK OPTION;
Aquesta vegada NO podem modificar el departament d'un empleat amb la vista ja que aquest no compliria la condició per continuar a la vista.
START TRANSACTION;
UPDATE view_dept50 SET department_id = 90
WHERE employee_id = 124;
ERROR 1369 (44000): CHECK OPTION failed `empresa`.`view_dept50`
ROLLBACK;
Hem obtingut un error prou clarificador.
Restriccions de DML
Les vistes simples i complexes es dfierencien a l'hora de permetre operacions DML.
A les vistes simples podem realitzar operacions DML. Sempre que no es trenqui una regla de NOT NULL i d'UNIQUE.
A les vistes complexes, les operacions DML no sempre estan permeses.
Cal tenir en compte les tres regles següents quan realitzem operacions DML en vistes.
-
No podem eliminar una fila des d'una taula base subjacent si la vista conté quelcom de:
-
Funcions de grup
-
Una clàusula
GROUP BY -
La paraula clau
DISTINCT
-
-
No podem modificar dades d'una vista si aquesta conté quelcom de:
-
Funcions de grup
-
Una clàusula
GROUP BY -
La paraula clau
DISTINCT -
Columnes definides amb expressions
-
-
No podem afegir dades a una vista si aquesta:
-
Inclou funcions de grup
-
Inclou una clàusula
GROUP BY -
Inclou la paraula clau
DISTINCT -
Inclou columnes definides amb expressions
-
No inclou columnes
NOT NULLa les taules base
-