Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теоретические основы реляционных баз данных. Учебное пособие.pdf
Скачиваний:
0
Добавлен:
15.08.2026
Размер:
936 Кб
Скачать

- 54 -

Если не указывать к какой таблице относится столбец, по которому таблицы связаны предложением WHERE, то будет выдана ошибка.

CREATE VIEW v_group AS

 

 

 

 

 

SELECT family, name, gpa ,stgroup,

 

v.department, faculty

 

 

 

 

 

FROM v_students v, departments d

 

WHERE v.department = d.department;

 

CREATE VIEW

 

 

 

 

 

 

SELECT family,name,stgroup,department

as dep,faculty

FROM v_group ;

 

 

 

 

 

 

family

| name

|

stgroup |

dep

| faculty

--------------+--------+---------+---------+---------

Колычева

| Лия

|

342

|

ЭВМ

| ФВТ

Фахрудинова

| Тамара |

342

|

ЭВМ

| ФВТ

Никулкин

| Сергей |

342

|

ЭВМ

| ФВТ

Катеринченко

| Андрей |

342

|

ЭВМ

| ФВТ

Балашов

| Андрей |

342

|

ЭВМ

| ФВТ

Чертков

| Максим |

344

|

САПР

| ФВТ

Малин

| Сергей |

345

|

ВПМ

| ФВТ

(7 rows)

 

 

 

 

 

 

Следует заметить, что представления могут включать и подзапросы.

Многие представления могут быть доступны только для чтения, т. е. их можно запрашивать, но нельзя модифицировать через них данные в физических таблицах.

Как и любой другой объект базы данных, удалить представление можно с помощью команды DROP:

DROP VIEW v_group ; DROP VIEW

2.10. Модификация данных с помощью представлений

Рассмотрим, как можно применять команды модификации данных (команды языка DML) ВСТАВИТЬ (INSERT), ИЗМЕНИТЬ (UPDATE) и УДАЛИТЬ (DELETE) для представлений.

Следует заметить, что не все представления можно модифицировать.

Поскольку само представление является результатом запроса, то мы пытаемся изменять результат запроса, но модификация реально воздействует на значение в таблице, к которой и был сделан запрос.

Для того чтобы представление было модифицируемым, оно:

должно выводиться из одной, и только из одной, базовой таблицы;

-55 -

должно содержать первичный ключ этой таблицы;

не должно иметь никаких полей, которые являлись бы агрегатными функциями;

не должно содержать DISTINCT в своем определении;

не должно использовать GROUP BY или HAVING в своем определении;

не должно использовать подзапросы;

может быть использовано в другом представлении, но это представление должно также быть модифицируемым;

не должно использовать константы, строки или выражения для значений среди выбранных полей вывода;

для INSERT должно содержать любые поля основной таблицы, которые имеют ограничение NOT NULL, если другое ограничение по умолчанию не определено.

Модифицируемые представления фактически подобны окнам в базовых таблицах. Они показывают кое-что, но не обязательно всё, из содержимого таблицы. Они могут ограничивать определенные строки (использованием предикатов) или специально именованные столбцы (с исключениями), но они представляют значения непосредственно и не выводят информацию с использованием составных функций и выражений.

Модифицируемые представления в основном используются точно так же, как и базовые таблицы. Фактически пользователи не могут даже осознать, является ли объект, который они запрашивают, базовой таблицей или представлением.

Представления только_чтение позволяют получать и переформатировать данные более рационально.

Представления только_чтение могут также использоваться для защиты данных. Например, вы можете захотеть, чтобы некоторые пользователи видели агрегатные данные, а не представление индивидуальных значений.

Следующее представление, содержащее часть информации о студентах определенной группы, является модифицируемым:

CREATE VIEW stud2

AS SELECT family, name, gpa, sex FROM students WHERE stgroup='342';

CREATE VIEW

В данном представлении сделана только выборка части столбцов (все кроме номера группы) и строк, относящихся к группе 342.

SELECT * FROM stud2;

 

 

 

- 56 -

family

| name

|

gpa

| sex

--------------

+--------

+

------

+-----

Балашов

| Андрей |

5.00

| м

Катеринченко

| Андрей |

4.59

| м

Никулкин

| Сергей |

4.79

| м

Фахрудинова

| Тамара |

4.12

| ж

Колычева

| Лия

|

4.38

| ж

(5 rows)

 

 

 

 

Мы вполне можем изменить данные в этом представлении, например средний балл определенного студента.

UPDATE stud2 SET gpa =

3.25 WHERE family='Колычева';

UPDATE 1

 

 

 

SELECT * FROM stud2;

 

 

family

| name

| gpa

| sex

--------------

+--------

+------

+-----

Балашов

| Андрей

| 5.00 | м

Катеринченко

| Андрей

| 4.59 | м

Никулкин

| Сергей

| 4.79 | м

Фахрудинова

| Тамара

| 4.12 | ж

Колычева

| Лия

| 3.25 | ж

(5 rows)

 

 

 

Следующее представление содержит агрегатную функцию, позволяющую получать информацию о среднем балле по группе:

CREATE VIEW avg_group

AS SELECT stgroup, AVG(gpa) AS agpa FROM students

GROUP BY

stgroup;

CREATE

VIEW

 

SELECT

*

FROM avg_group ;

stgroup

|

agpa

---------

 

+--------------------

 

345| 4.8700000000000000

346| 4.0400000000000000

347| 4.3900000000000000

342| 4.3500000000000000

344| 4.3100000000000000

(5 rows)

Попытка его модификации приведет к следующему результату:

UPDATE avg_group SET agpa=4.25 WHERE stgroup = '344'; ERROR: cannot update view "avg_group"

DETAIL: Views containing GROUP BY are not automatically updatable.

-57 -

Всообщении об ошибке указывается на то, что нельзя изменять представление, содержащее агрегатные функции (в нашем случае это функция для получения среднего балла AVG).

Следует обратить внимание на одну особенность при работе с представлениями, когда результат запроса, например на изменение данных, не оказывает воздействия на базовую таблицу, если касается строк, которые не представлены в представлении. В представлении stud2 выбрана информация, которая относится исключительно к студентам из группы 342, поэтому запросы на изменение данных, которые относятся к студентам других групп, будут игнорироваться.

UPDATE stud2 SET gpa = 4.15

WHERE family='Малин';

UPDATE

0

 

 

SELECT

* FROM students ;

 

family

| name

| stgroup | gpa | sex

--------------+----------+---------+------+-----

Балашов

| Андрей

| 342

| 5.00 | м

Катеринченко

| Андрей

| 342

| 4.59 | м

Малин

| Сергей

| 345

| 4.87 | м

Никулкин

| Сергей

| 342

| 4.79 | м

Фахрудинова

| Тамара

| 342

| 4.12 | ж

Чертков

| Максим

| 344

| 4.31

| м

Нефедов

| Максим

| 347

| 4.39

| м

Косымскова

| Светлана

| 346

| 4.04

| ж

Колычева

| Лия

| 342

| 3.25

| ж

(9 rows)

 

 

 

 

По результатам запроса мы видим, что изменения затронули 0 строк и средний балл у студента группы 345 Малина не изменился.

2.11. Разграничение доступа в базе данных

Во-первых, администраторы баз данных сами создают пользователей и дают им привилегии.

Во-вторых, пользователи, которые создают таблицы, сами имеют права на управление этими таблицами.

Привилегии определяют, может ли указанный пользователь выполнить данную команду.

Имеется несколько типов привилегий, соответствующих нескольким типам операций. Привилегии даются и отменяются двумя командами SQL: GRANT (ДОПУСК) и REVOKE (ОТМЕНА).

Команда, посланная в базе данных, ассоциируется с определённым пользователем, а SQL может использовать специальное

- 58 -

ключевое слово USER, которое ссылается на Идентификатор доступа, связанный с текущей командой. Команда интерпретируется и разрешается (или запрещается) на основе информации, связанной с Идентификатором доступа пользователя, подавшего команду.

Каждый пользователь БД SQL имеет набор привилегий, который определяет, что пользователю разрешается делать.

SQL-привилегии - это привилегии на объекты, то есть пользователь имеет привилегию для выполнения данной команды только на определенном объекте в БД. Очевидно, что привилегии должны различать эти объекты, но система привилегий, основанная исключительно на привилегиях объекта, не может адресовать всё, что нужно SQL.

Пользователь имеет все привилегии на созданные им объекты и может передавать привилегии другим пользователям.

Вот основные привилегии, которые можно назначить

пользователю:

 

SELECT

Пользователь может выполнять запросы в таблице.

INSERT Пользователь может выполнять команду INSERT в таблице.

UPDATE

Пользователь может выполнять команду UPDATE в

таблице, при этом можно ограничить эту привилегию для определенных столбцов таблицы.

DELETE

Пользователь с этой привилегией может выполнять

команду DELETE в таблице.

REFERENCES Пользователь может определить внешний ключ, который использует один или более столбцов этой таблицы, как родительский ключ, можно ограничить эту привилегию для определённых столбцов.

Здесь были перечислены только основные привилегии на объекты, которые требуются для повседневной работы пользователя.

CREATE USER petrov; CREATE ROLE

SELECT table_catalog, table_schema, table_name, privilege_type

FROM information_schema.table_privileges WHERE grantee = 'petrov';

table_catalog|table_schema |

table_name | privilege_type

-------------+-------------

+

------------+---------------

(0 rows)

 

 

Из приведенного выше примера видно, что вновь созданный пользователь petrov не имеет ни одной привилегии ни на одну таблицу в базе данных.

- 59 -

Теперь дадим этому пользователю привилегии на чтение и запись в одну таблицу и только на чтение в другую таблицу.

GRANT SELECT, UPDATE ON students TO petrov ; GRANT

GRANT SELECT ON stgroups TO petrov ; GRANT

SELECT table_catalog, table_schema, table_name, privilege_type

FROM information_schema.table_privileges WHERE grantee = 'petrov';

table_catalog|table_schema

|table_name

| privilege_type

--------------

+-------------

+-----------

+--------------

university

| public

| students

| SELECT

university

| public

| students

| UPDATE

university

| public

| stgroups

| SELECT

(3 rows)

 

 

 

Теперь мы видим, что заданные привилегии зафиксированы в словаре данных.

Предположим, что новому пользователю надо дать привилегии только на один из столбцов в таблице, например позволить ему изменять только средний балл студентов, тогда это следует реализовать следующим образом:

CREATE USER sidorov;

CREATE ROLE

GRANT UPDATE (gpa) ON students TO sidorov;

GRANT

Удаление привилегии выполняется командой REVOKE. Синтаксис команды REVOKE похож на GRANT, но имеет обратный смысл.

REVOKE UPDATE ON students FROM petrov; REVOKE

SELECT table_catalog, table_schema, table_name, privilege_type

FROM information_schema.table_privileges WHERE grantee = 'petrov';

table_catalog |table_schema

|table_name

| privilege_type

--------------

+-------------

+-----------

+------------

university

| public

| stgroups

| SELECT

university

| public

| students

| SELECT

(2 rows)

 

 

 

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]