Передача прав доступа для производных данных.
Ограничение области действия привилегий определенным подмножеством строк.
Ограничение привилегии select для определенных столбцов.
Предположим, нужно дать пользователю Claire возможность видеть только столбцы snum и sname таблицы Salespeople. Это можно сделать, указав имена этих столбцов в представлении:
CREATE VIEW Clairesview AS SELECT snum, sname FROM Salespeople;
и передав Claire привилегию SELECT на представление, а не на таблицу Salespeople:
GRANT SELECT ON Clairesview to Claire;
Такие привилегии на использование столбцов можно создать, применяя и другие привилегии, но для команды INSERT это означает вставку значений по умолчанию, а для команды DELETE ограничения на столбцы будут бессмысленны. Привилегии UPDATE и REFERENCES могут быть сделаны для столбцов без изменения представления.
Более полезным способом фильтрации привилегий для представлений является использование самого представления для ограничения привилегии отдельными строками. Естественно, для этого в представлении используется предикат, определяющий какие строки интересны. Например, чтобы передать привилегию на выполнение команды UPDATE для всех покупателей (таблица Customers), расположенных в Лондоне (city = 'London'), Adrian, можно создать такое представление:
|
|
CREATE VIEW Londoncust AS SELECT * FROM Customers WHERE city = 'London' WITH CHECK OPTION;
Затем можно передать привилегию UPDATE Adrian:
GRANT UPDATE ON Londoncust TO Adrian;
Эта привилегия отличается от определенной на столбцах привилегии UPDATE тем, что исключаются все строки таблицы Customers, в которых значение поля city отлично от 'London'. Предложение WITH CHECK OPTION не дает возможности Adrian изменять значение поля city.
Можно также предоставить пользователям доступ к производным данным, отличным от реальных данных таблицы. В этом случае могут быть полезны функции агрегирования. Можно создать представление, которое дает общее число, среднюю величину и сумму по полю amt для заказов, поступивших на каждую дату:
CREATE VIEW Datetotals AS SELECT odate, COUNT (*), SUM (amt), AVG (amt) FROM Orders GROUP BY odate;
Теперь Dine дается привилегия выполнять команду SELECT для представления Datetotals:
GRANT SELECT ON Datetotals TO DIane;
Один из вариантов применения техники, упомянутой в главе 18, состоит в использовании представлений WITH CHECK OPTION вместо ограничений. Предположим, нужно удостовериться, что все значения поля city в таблице Salespeople имеют одно и то же значение — название города, в котором в настоящее время расположен офис компании. Можно использовать ограничение CHECK на столбец city непосредственно, но позже будет трудно внести изменения, если компания откроет еще ряд офисов. Альтернативой является создание представления, которое исключает ошибочные значения поля city:
|
|
CREATE VIEW Curcitles AS SELECT * FROM SalespeopleWHERE city IN ('London', 'Rome', 'San Jose', 'Benin') WITH CHECK OPTION;
Теперь, вместо привилегии изменять таблицу Salespeople, пользователям дается привилегия на предоставление им представления Curcities. Преимущество этого подхода заключается в следующем: при необходимости внести изменение можно исключить это представление, создать новое представление и передать пользователям привилегии на него, что гораздо проще, чем менять ограничение. Недостаток заключается в том, что владелец таблицы Salespeople также должен использовать это представление, если он хочет наверняка исключить собственные ошибки.
С другой стороны, такой метод позволяет владельцу таблицы и всем другим пользователям, имеющим право обновлять привилегии для самой таблицы, а не для представления, делать исключения для ограничений. Это весьма желательно, но невыполнимо при использовании ограничений на саму базовую таблицу. Эти исключения невидимы в представлении. Если применяется такой метод, можно создать второе представление, содержащее только ограничения:
CREATE VIEW Othercities AS SELECT * FROM Salespeople WHERE city NOT IN ('London', 'Rome', 'San Jose', 'Berlin') WITH CHECK OPTION;
При передаче пользователям только привилегии на выполнение команды SELECT для этого представления они смогут видеть исключенные строки, но не смогут занести ошибочные значения в базовую таблицу. Фактически пользователи могут сформулировать запросы к двум представлениям, сформировать их объединение и увидеть все строки за один раз.