Управление представлениями

Проектирование баз данных

Lis Sulmont

Curriculum Manager

Создание сложных представлений

  • Агрегация: SUM(), AVG(), COUNT(), MIN(), MAX(), GROUP BY, и др.
  • Объединения: INNER JOIN, LEFT JOIN. RIGHT JOIN, FULL JOIN
  • Условия: WHERE, HAVING, UNIQUE, NOT NULL, AND, OR,>,<, и др.
Проектирование баз данных

Предоставление и отзыв доступа к представлению

GRANT privilege(s) или REVOKE privilege(s)

ON object

TO role или FROM role

  • Привилегии: SELECT, INSERT, UPDATE, DELETE, и др.
  • Объекты: таблица, представление, схема, и др.
  • Роли: пользователь базы данных или группа пользователей
Проектирование баз данных

Примеры предоставления и отзыва доступа

$$

GRANT UPDATE ON ratings TO PUBLIC;  

$$

REVOKE INSERT ON films FROM db_user;
Проектирование баз данных

Обновление представления

UPDATE films SET kind = 'Dramatic' WHERE kind = 'Drama';

Не все представления допускают обновление

  • Представление основано на одной таблице
  • Не использует оконные или агрегатные функции
1 https://www.postgresql.org/docs/9.5/sql-update.html
Проектирование баз данных

Вставка данных через представление

INSERT INTO films (code, title, did, date_prod, kind)
    VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');

Не все представления допускают вставку

1 https://www.postgresql.org/docs/9.5/sql-insert.html
Проектирование баз данных

Вставка данных через представление

INSERT INTO films (code, title, did, date_prod, kind)
    VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');

Не все представления допускают вставку

Вывод: избегайте изменения данных через представления

1 https://www.postgresql.org/docs/9.5/sql-insert.html
Проектирование баз данных

Удаление представления

DROP VIEW view_name [ CASCADE | RESTRICT ];
  • RESTRICT (по умолчанию): возвращает ошибку, если от представления зависят другие объекты
  • CASCADE: удаляет представление и все зависящие от него объекты
Проектирование баз данных

Переопределение представления

CREATE OR REPLACE VIEW view_name AS new_query
  • Если представление с именем view_name существует, оно заменяется
  • new_query должен возвращать те же имена столбцов, порядок и типы данных, что и исходный запрос
  • Содержимое столбцов может отличаться
  • Новые столбцы можно добавлять в конец

Если эти условия не выполняются, удалите существующее представление и создайте новое

1 https://www.postgresql.org/docs/9.2/sql-createview.html
Проектирование баз данных

Изменение представления

ALTER VIEW [ IF EXISTS ] name ALTER [ COLUMN ] column_name SET DEFAULT expression
ALTER VIEW [ IF EXISTS ] name ALTER [ COLUMN ] column_name DROP DEFAULT
ALTER VIEW [ IF EXISTS ] name OWNER TO new_owner
ALTER VIEW [ IF EXISTS ] name RENAME TO new_name
ALTER VIEW [ IF EXISTS ] name SET SCHEMA new_schema
ALTER VIEW [ IF EXISTS ] name SET ( view_option_name [= view_option_value] [, ... ] )
ALTER VIEW [ IF EXISTS ] name RESET ( view_option_name [, ... ] )
1 https://www.postgresql.org/docs/9.2/sql-alterview.html
Проектирование баз данных

Давайте потренируемся!

Проектирование баз данных

Preparing Video For Download...