Право на удаление записей предоставляется очень просто, например:
GRANT DELETE
ON Клиенты, Сотрудники, Товары
TO SuperManager;
Рассмотрим пример предоставления прав на использование ссылок одних таблиц на другие. Так, две таблицы оказываются связанными, если в одной таблице задан внешний ключ, ссылающийся на первичный ключ в другой таблице. В этом случае если у пользователя есть права доступа к первой таблице, то он может получить некоторые сведения и из второй, даже если у него нет права доступа к этой таблице.
Предположим, пользователю стало известно о появлении в базе данных особой таблицы Сотрудники_секретно, содержащей отдельный список сотрудников, например, представленных к премии или, наоборот, к увольнению. Ему также стало известно, что первичным ключом в этой таблице является столбец id. Однако пользователь не имеет никаких прав на эту таблицу, даже права на просмотр. Тогда он может узнать, кто попал в секретный список, следующим образом. Сначала он создает таблицу mytab со столбцом id, который определяет как внешний ключ со ссылкой на таблицу Сотрудники_секретно:
CREATE TABLE mytab (
ID INTEGER REFERENCES Сотрудники_секретно
) ;
Затем пользователь пытается добавить новые записи в свою таблицу mytab, подбирая значения столбца id. Если выбранное им значение принимается таблицей mytab, то сотрудник с данным идентификатором находится в секретном списке, а в противном случае – нет. Узнав таким способом список идентификаторов сотрудников секретного списка, шпион может по другой таблице (например, Сотрудники) узнать фамилии тех, кто был занесен в секретный список.
Поэтому согласно стандарту SQL:2003 права на использование ссылок должны устанавливаться явно:
GRANT REFERENCES (ID)
ON Сотрудники_секретно
TO PersonManager;
Это не позволит использовать описанный прием взлома защиты.
При создании таблиц нередко используют определения доменов (множество значений). Домен в реляционной теории связывается с атрибутом отношения и определяет некоторое ограничение на этот атрибут. Домены позволяют определить однотипные столбцы с одинаковыми ограничениями, находящиеся в различных таблицах. Ограничения на вводимые данные можно назначить не только для отдельных столбцов, но и для таблиц в целом. Чтобы создать домен используется синтаксис:
CREATE DOMAIN имяДомена типДанных Ограничения;
Обратите внимание, что в определении домена, пока не связанного ни с каким столбцом какой-либо таблицы, задается тип значений домена и ограничения на эти значения. Например, в нескольких таблицах БД имеется столбец с именем Код_продукта и типом CHAR (6), значения которого должны начинаться с символа «А», «С» или «Х». Для таких столбцов можно предварительно создать общий домен:
После определения домена можно создавать таблицу, использующую этот домен:
CREATE TABLE Товары (
Код_продукта ProdDomain,
Описание VARCHAR
);
Например, можно определить домен Bonus (премия) с типом данных decimal (*9,2) и ограничением, согласно которому премия не может быть отрицательной и больше 15000:
CREATE DOMAIN Bonus
DECIMAL (9, 2)
CHECK (Bonus >= 0 AND Bonus <= 15000);
Тогда этот домен можно применить для определения столбцов в одной или нескольких таблицах. Например:
CREATE TABLE Платежная_ведомость (
ID INTEGER,
Имя VARCHAR (25),
Оклад DECIMAL (9,2),
Премия Bonus
);
Однако при использовании доменов могут возникнуть вопросы, связанные с безопасностью. Так, верхняя граница премии может являться секретом для большинства пользователей. Однако любой пользователь может создать таблицу со столбцом, который определен через домен Bonus. Постепенно увеличивая значения в этом столбце, пока они принимаются таблицей, можно узнать максимальное значение (попытка ввести большее значение будет отвергнута СУБД).
Чтобы не допустить такой возможности, владелец Домена (тот, кто его-создал) должен явно предоставить права на его использование, например: