Группы привилегий, группы пользователей.
Команда GRANT
Предположим, пользователь Diane является владельцем таблицы Customers и нужно передать пользователю Adrian право на формулирование запросов к этой таблице. Для этого пользователь Diane должен ввести следующую команду:
GRANT SELECT ON Customers TO Adrian;
Теперь Adrian может выполнять запросы по таблице Customers. Без других привилегий он имеет право выполнять только выборку, а не какие-либо действия, влияющие на значения элементов таблицы Customers (включая использование Customers в качестве родительской таблицы внешнего ключа, ограничивающего изменения, которые могут быть сделаны для значений таблицы Customers).
Когда SQL выполняет команду GRANT, он выбирает привилегии пользователя, давая ему возможность определить GRANT как допустимую команду. Сам пользователь Adrian не может задать выполнение этой команды, а также передать право выполнения SELECT другому пользователю: владельцем таблицы остается Dian (хотя было показано, как Dian может передать права на выполнение команды SELECT пользователю Adrian).
Для передачи прав на другие привилегии синтаксис тот же самый. Если Adrian является владельцем таблицы Salespeople, то он может разрешить Dian вводить в нее строки; для этого следует указать команду:
GRANT INSERT ON Salespeople TO Diane;
Теперь Diane может вносить в таблицу сведения о новых продавцах.
Передача привилегий не ограничивается передачей единственной привилегии единственному пользователю с помощью одной команды GRANT. Списки привилегий или пользователей с элементами, разделенными запятыми, допустимы. Например, Stephen может передать права на выполнение команд SELECT и INSERT для таблицы Orders пользователю Adrian:
GRANT SELECT, INSERT ON Orders TO Adrian;
либо пользователям Adrian и Diane:
GRANT SELECT, INSERT ON Orders TO Adrian, Diane;
При перечислении привилегий и пользователей все указанные в списке привилегии передаются всем перечисленным пользователям. В соответствии с интерпретацией ANSI, нельзя передать привилегии для множества таблиц в одной команде, но некоторые программные продукты разрешают использование нескольких имен таблиц, разделенных запятыми, таким образом, что все перечисленные пользователи получают все перечисленные привилегии для всех указанных в списке таблиц.
Все объектные привилегии используют один и тот же синтаксис, за исключением команд UPDATE и REFERENCES, в которых, в случае необходимости, можно указывать имена столбцов. Привилегию выполнения команды UPDATE можно передать как и все остальные привилегии:
GRANT UPDATE ON Salespeople TO Diane;
Команда разрешает пользователю Diane изменять значения любого или всех столбцов таблицы Salespeople. Однако, если Adrian желает ограничить Diane возможностью изменять только значения комиссионных (значения столбца comm), то он должен вместо предыдущей команды указать:
GRANT UPDATE (comm) ON Salespeople TO Diane;
Т.е. пользователь просто должен указать после имени таблицы в круглых скобках имя столбца, на который распространяется привилегия UPDATE. Множество имен столбцов таблицы можно указать в любом порядке через запятую:
GRANT UPDATE (city, comm) ON Salespeople TO Diane;
REFERENCES задается в соответствии с теми же правилами. Когда привилегии REFERENCES передаются другому пользователю, он может создать внешние ключи, которые ссылаются на столбцы вашей таблицы как на родительские ключи. Подобно UPDATE, привилегия REFERENCES может содержать список из одного или более столбцов для каждой привилегии. Например, Diane может передать Stephen право использования таблицы Customers в качестве родительского ключа с помощью следующей команды:
GRANT REFERENCES (cname, cnum) ON Customers TO Stephen;
Команда дает Stephen право использовать столбцы cnum и cname в качестве родительских ключей для любых внешних ключей в этих таблицах. Stephen получает возможность управления по собственному усмотрению. В одной из его собственных таблиц он может определить (cname, cnum) или, например, (cnum, cname) как родительский ключ, определенный на двух столбцах и соответствующий внешнему, определенному на двух столбцах. Или он может создать отдельные внешние ключи для ссылки на поля индивидуально, при условии, что Diane имеет подходящим образом разработанные родительские ключи (см. главу 19). Здесь нет ограничений на число внешних ключей, которые могут базироваться на родительских ключах, и на число родительских ключей для разрешенного множества внешних ключей. Что касается привилегии UPDATE, то можно опустить список столбцов и, следовательно, разрешить использование всех столбцов в качестве родительских ключей. Adrian может передать Diane права делать это следующим образом:
GRANT REFERENCES ON Salespeople TO Diane;
Естественно, привилегии полезны только для тех столбцов, которые удовлетворяют ограничениям, необходимым для родительских ключей.