На практике нередко делают так, чтобы права доступа мог предоставлять только администратор и владельцы объектов БД. При этом владельцы предоставляют права только на объекты, которыми владеют. Третьи лица, получившие права доступа от администратора и/или владельцев, уже не могут предоставлять права. Во многих случаях это вполне разумное ограничение, позволяющее администратору и владельцам сохранить достаточно полный контроль над системой. Вместе с тем встречаются ситуации, в которых желательно делегировать право предоставлять свои собственные права другим пользователям (например, своим сменщикам, на период отпуска и т. п.). С этой целью в операторе grant используются ключевые слова with GRANT OPTION.
Например, право обновлять и добавлять записи в таблице сотрудники предоставляется менеджеру по продажам с именем SalesManager. Причем ему предоставляется право передавать полученные права доступа другому пользователю.
GRANT UPDATE, INSERT
ON Сотрудники
TO SalesManager
WITH GRANT OPTION;
Теперь менеджер по продажам может передать свои права помощнику С именем AssistantManager:
GRANT UPDATE, INSERT
ON Сотрудники
TO AssistantManager;
Co временем обязанности пользователей базы меняются, кто-то из них может перейти на сторону конкурента и, наконец, некоторые ранее предоставленные привилегии могут оказаться просто ошибочными с точки зрения общей защиты БД. В этих случаях появляется необходимость отменить привилегии. Отмена привилегий выполняется е помощью оператора revoke (отмена, аннулирование), причем можно отменить указанные в списке права (все или только некоторые) для перечисленных пользователей:
REVOKE [GRANT OPTION FOR] списокПрав .
ON объект
FROM списокПользователей [RESTRICT | CASCADE];
Значения необязательных ключевых слов:
· GRANT OPTION for (право предоставления для) – применяется, чтобы отменить у пользователя право передавать указанные права, но оставить эти права за пользователем;
· RESTRICT (ограничить) – отменяются права у пользователей, которые никому другому их не предоставляли. Однако если пользователь уже успел предоставить права, указанные в этом операторе revoke, то оператор не будет выполнен и появится сообщение об ошибке;
· CASCADE (каскадно) – отменяются указанные права у перечисленных пользователей, а также у тех, кому эти пользователи успели предоставить данные права.
Следует иметь в виду, что пользователь может получить одни и те же права от различных привилегированных пользователей. Если один из них отзовет предоставленные права, у пользователя они все равно могут остаться, поскольку продолжают действовать права, предоставленные кем-то другим. При передаче прав от одного пользователя другому возникают зависимости прав: права одного пользователя зависят от того, продолжает ли ими обладать другой.
Очень часто предоставление прав многим пользователям на многочисленные объекты связано с большими объемами SQL-кода. Комбинируя операторы grant и revok, предоставляя сначала широкие права для многих, а затем ограничивая их для некоторых пользователей, можно сократить общий объем SQL-кода.