Использование представлений как альтернативы системе ограниче­ний

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

Ограничение области действия привилегий определенным подмноже­ством строк.

Ограничение привилегии select для определенных столбцов.

Предположим, нужно дать пользователю Claire возможность видеть только столбцы snum и sname таблицы Salespeople. Это можно сделать, указав имена этих столбцов в представлении:

CREATE VIEW Clairesview AS SELECT snum, sname FROM Salespeople;

и передав Claire привилегию SELECT на представление, а не на таблицу Sales­people:

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 в таблице Sales­people имеют одно и то же значение — название города, в котором в настоящее время расположен офис компании. Можно использовать ограничение 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 для этого представления они смогут видеть исключенные строки, но не смогут занести ошибочные значения в базовую таблицу. Фактически пользова­тели могут сформулировать запросы к двум представлениям, сформировать их объединение и увидеть все строки за один раз.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: