C, PHP, VB, .NET

Дневникът на Филип Петров


* Виртуални таблици (view)

Публикувано на 07 април 2009 в раздел Бази от Данни.

Виртуалните таблици са още познати с директния си превод от английски език като "изгледи". На практика виртуалната таблица е съхранен SQL SELECT оператор, който си има собствено име в базата данни. Използва се когато често използваме едни и същи SELECT заявки.

Виртуалните таблици имат и редица други предимства:
- Различните потребители в системата могат да виждат едни и същи данни по различен начин;
- Удобни са за ограничаване се достъпа на потребителите до базовата таблица и така те могат да достъпват само данните, които извежда виртуалната таблица.

Виртуална таблица се създава чрез операторът CREATE VIEW:

CREATE VIEW <име>(<имена на колони>)
AS SELECT <имена на колони> ... ;

Във вложения оператор SELECT не може да се използва ORDER BY и UNION. Важно е да има съответствие между върнатите колони от оператора SELECT и изброените след името на VIEW.

Пример: Създаване на виртуална таблица с данните на служителите на банка Bulbank:

 CREATE VIEW bulbank_employees
 AS SELECT * FROM employees
    WHERE branch_id IN(
       SELECT id FROM branches
       WHERE bank_code IN(
          SELECT code FROM banks
          WHERE name = "Bulbank"
       )
    );

Сега можем да го използваме също както обикновена таблица:

mysql> SELECT * FROM bulbank_employees;
+----+-----------------+-----------+
| id | name            | branch_id |
+----+-----------------+-----------+
|  1 | Ivan Ivanov     |         1 |
|  3 | Mihail Zahariev |         1 |
|  4 | Milen Stoilov   |         2 |
|  5 | Svilen Petrov   |         2 |
|  6 | Ilian Stoianov  |         2 |
|  7 | Petar Petrov    |         2 |
+----+-----------------+-----------+
6 rows in set (0.00 sec)

Можем да изпълняваме и заявки от тип INSERT, UPDATE и DELETE - те ще бъдат трансформирани автоматично от системата за управление на бази данни върху базовата таблица.

Ако в операторът SELECT участва агрегатна функция или GROUP BY, то става напълно необновяемо. Изобщо използването на INSERT, UPDATE и DELETE при VIEW не се препоръчва. Най-често VIEW се използва "само за четене" и съответно потребителите се рестриктират да имат само права SELECT върху тези таблици.

За изтриването на VIEW става чрез оператора DROP VIEW:

DROP VIEW bulbank_employees CASCADE;

Ключовата дума CASCADE означава, че ако има производно на това VIEW (т.е. VIEW създадено чрез изтриваното VIEW), то също ще бъде изтрито. Алтернативата е с ключова дума RESTRICT, където ако има производно VIEW, то ще бъде върната грешка. По принцип не е добра идея да създавате производни една на друга виртуални таблици. Стойността по подразбиране на DROP VIEW e CASCADE.

 



4 коментара


  1. Във CREATE VIEW заявката сте написали след името на виртуалната таблица в скоби , но по-надолу не виждам обяснение за какво се ползват тези колони. Може ли да поясните как участват те в заявката?

  2. Задава изрично имената на колоните в резултатната таблица вместо да използва тези от SELECT заявката.

  3. В една другия се споменава, че могат да се изпълняват заявки INSERT, DELETE, UPDATE на VIEW. При изпълняването на тези заявки върху VIEW те променят ли и информацията, от която е създадено това VIEW ( променя ли се оригинала или заявките влият само върху VIEW-то).

Добави коментар

Адресът на електронната поща няма да се публикува


*