Использование аргументов ALL и PUBLIC
SQL поддерживает два аргумента для команды GRANT, которые имеют специальное назначение: ALL PRIVILEGES (или просто ALL) и PUBLIC. ALL используется вместо имен привилегий в команде GRANT для передачи всех привилегий для таблицы. Например, пользователь Diane может передать пользователю Stephen множество привилегий для таблицы Customers с помощью команды:
GRANT ALL PRIVILEGES ON Customers TO Stephen;
(Привилегии для команд UPDATE и REFERENCES относятся ко всем столбцам.) Альтернативным способом сказать то же самое является команда:
GRANT ALL ON Customers TO Stephen;
PUBLIC — своего рода обобщающий аргумент, но он относится к пользователям, а не к привилегиям. Когда передаются привилегии с атрибутом "общедоступный" (PUBLIC), все пользователи получают их автоматически. Чаще это применяется для привилегии SELECT для определенных базовых таблиц или представлении, которые нужно предоставить каждому пользователю для рассмотрения. Разрешить каждому пользователю просматривать таблицу Orders можно, например, вводом следующей команды:
|
|
GRANT SELECT ON Orders TO PUBLIC;
Можно передавать любую привилегию или все привилегии в общее пользование, но делать это нежелательно. Все привилегии, за исключением SELECT, разрешают пользователю изменять (или, в случае REFERENCES, ограничивать) содержимое таблицы. Разрешение всем пользователям изменять содержимое таблиц влечет за собой множество проблем. Даже в небольшой компании предпочтительнее передача привилегий каждому пользователю индивидуально, а не всем сразу. При применении ключевого слова PUBLIC речь идет не только обо всех существующих пользователях. Любой новый пользователь, подключаемый к системе, автоматически получает все привилегии, назначенные с применением ключевого слова PUBLIC. Поэтому для ограничения доступа к таблице в любое время — либо только сейчас, либо в будущем — лучше передать привилегии пользователям, применяя метод, отличный от SELECT.
Иногда создатель таблицы хочет, чтобы другие пользователи имели право передавать привилегии на эту таблицу. Это реально для систем, в которых один или несколько человек могут создать большинство или все базовые таблицы базы данных, а затем передать права по работе с этими таблицами тем, кто реально будет с ними работать. SQL позволяет это сделать с помощью предложения WITH GRANT OPTION.
Если Diane желает, чтобы Adrian имел право передавать полномочия на работу с таблицей Customers другим пользователям, то он должен передать Adrian привилегию на выполнение команды SELECT и применить предложение WITH GRANT OPTION:
GRANT SELECT ON Customers TO Adrian WITH GRANT OPTION;
После выполнения этой команды Adrian получает право передать привилегию выполнения команды SELECT третьим лицам. Для этого он должен выполнить команду:
|
|
GRANT SELECT ON Diane.Customers TO Stephen;
или даже:
GRANT SELECT ON Diane.Customers TO Stephen WITH GRANT OPTION;
Пользователь с GRANT OPTION для отдельной привилегии для данной таблицы может, в свою очередь, передать эту конкретную привилегию на эту таблицу с предложением или без предложения GRANT OPTION любому другому пользователю, что не изменяет владельца таблицы: таблицы всегда принадлежат их создателям. (В качестве префикса перед именем таблицы следует указывать идентификатор создателя таблицы, как это было продемонстрировано в примере. В следующей главе будет показан другой способ.) Пользователь с GRANT OPTION на все привилегии для данной таблицы имеет большую власть над этой таблицей.