Иллюстрированный самоучитель по SQL для начинающих

Обеспечение безопасности базы данных

Аннулирование полномочий

Наряду с предоставлением полномочий доступа существует необходимость иметь возможность аннулировать эти полномочия. Обязанности сотрудников со временем изменяются, следовательно, изменяются их потребности в доступе к данным. Нередки случаи перехода на работу к конкуренту. В этом случае все полномочия перешедших сотрудников придется отозвать. В SQL удаление полномочий на доступ выполняется с помощью оператора REVOKE (отозвать). Его синтаксис аналогичен синтаксису оператора GRANT, но только результат получается противоположный.

REVOKE [GRANT OPTION FOR] список-полномочий
ON объект
FROM список-пользователей [RESTRICT | CASCADE];

С помощью этой структуры можно отзывать перечисленные в списке полномочия, не затрагивая при этом все остальные. Главное отличие между операторами REVOKE и GRANT состоит в том, что в первом из них применяется одно из двух необязательных ключевых слов – RESTRICT (ограничить) или CASCADE (каскадное удаление). Пусть для предоставления полномочий вы использовали оператор GRANT вместе с WITH GRANT OPTION. Тогда применение ключевого слова CASCADE в операторе REVOKE приводит к отзыву указанных полномочий как у того пользователя, которому вы их предоставили, так и у всех пользователей, кому (благодаря атрибуту WITH GRANT OPTION) эти полномочия он уже успел предоставить.

С другой стороны, оператор REVOKE с ключевым словом RESTRICT будет отзывать полномочия пользователя, который никому больше их не предоставлял. Если пользователь уже с кем-то поделился полномочиями, указанными в операторе REVOKE с ключевым словом RESTRICT, то выполнение этого оператора будет прервано и будет выведено сообщение об ошибке.

Оператор REVOKE с необязательным предложением GRANT OPTION FOR (возможность предоставления) можно использовать, чтобы отзывать у пользователя возможность предоставлять указанные полномочия, но оставляя их для самого этого пользователя. Если оператор содержит предложение GRANT OPTION FOR и ключевое слово CASCADE, то отзываются все полномочия, предоставленные пользователем, а также полномочия этого пользователя на предоставление полномочий. А если в операторе есть и GRANT OPTION FOR и RESTRICT, то события развиваются по одному из двух вариантов.

  • Если пользователь не предоставил никому другому те полномочия, которые вы у него отзываете, то выполняется оператор REVOKE и удаляет способность этого пользователя предоставлять полномочия.
  • Если пользователь уже успел предоставить кому-нибудь хотя бы одно из отзываемых у него полномочий, то полномочия не отзываются, а возвращается код ошибки.

Внимание:
Возможность предоставлять полномочия с помощью предложения WITH GRANT OPTION – да еще в сочетании с выборочным отзывом полномочий – делает обеспечение безопасности вашей системы намного более сложным, чем кажется на первый взгляд. Например, любой пользователь, конечно же, может получить одни и те же полномочия от множества "дарителей". И если один из этих "дарителей" затем отзовет предоставленные им полномочия, у пользователя они все равно останутся. Дело в том, что продолжают действовать те же полномочия, но предоставленные другим "дарителем". Если благодаря предложению WITH GRANT OPTION полномочия передаются от одного пользователя к другому, то такая ситуация порождает цепочку зависимости. В этой цепочке полномочия одного пользователя зависят от таких же полномочий другого.
Если вы администратор или владелец объекта, то никогда не забывайте о том, что полномочия, предоставленные с помощью предложения WITH GRANT OPTION, могут "всплыть" в самых неожиданных местах. Достаточно трудным может оказаться отзыв полномочий у нежелательных пользователей при одновременном сохранении их у законных пользователей. Вообще говоря, предложения GRANT OPTION и CASCADE содержат в себе многочисленные ловушки. Поэтому при использовании этих предложений сверяйте стандарт SQL:2003 и документацию по имеющемуся у вас продукту. Это нужно, чтобы четко понимать, каким образом работают конструкции GRANT OPTION и CASCADE
.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.