Tenho o seguinte gráfico:
- B concedeu seleção em D e D concedeu seleção em E e E concedeu seleção em G.
- B concedeu seleção com opção de concessão e concedeu seleção D com opção de concessão.
- D concedeu seleção com opção de concessão e concedeu seleção E com opção de concessão.
- E concedeu seleção com opção de concessão e concedeu seleção G com opção de concessão.
Quando tento revogar o GRANT SELECT em D, recebo um erro que requer o uso de CASCADE.
Código:
EXECUTE AS USER = 'userB';
GO
REVOKE GRANT OPTION FOR SELECT ON EMP FROM userD;
GO
REVERT;
Erro:
Para revogar ou negar privilégios concedíveis, especifique a opção CASCADE.
O que eu preciso é remover o GRANT SELECT sem remover o GRANT SELECT de E e G.
Quando você concede permissões a um usuário usando a
WITH GRANT OPTION
cláusula e subsequentemente revoga essa permissão, o SQL Server impedirá a revogação, a menos que você adicione explicitamente aCASCADE
opção àREVOKE ...
instrução.Isso evita um risco de segurança pelo qual você concede
WITH GRANT OPTION
a um usuário, que subseqüentemente concede direitos a outros sem o seu conhecimento. Você então revoga os direitos desse usuário, mas o estrago já foi feito. Esta mensagem de erro é lançada quando você tenta revogar as permissões que foram atribuídas com a opção de concessão, a menos que você use aCASCADE
opção:Para revogar as permissões que foram concedidas usando a
WITH GRANT OPTION
cláusula, você deve revogar a permissão usando aCASCADE
opção. Isso também remove os direitos revogados de todos os usuários que receberam os direitos do usuário com oGRANT OPTION
. Se você deseja que esses outros usuários mantenham os direitos concedidos pelo usuário com oGRANT OPTION
, você deve atribuir manualmente esses direitos explicitamente a esses outros usuários.Este código abaixo é uma reprodução simples que mostra os sintomas e como lidar com isso.
Primeiro, crie um objeto ao qual possamos atribuir direitos:
Crie três usuários:
Conceder
SELECT WITH GRANT OPTION
ao usuáriou1
:Conceda
SELECT WITH GRANT OPTION
ao usuáriou2
como usuário 'u1':Conceda
SELECT WITH GRANT OPTION
ao usuáriou3
como usuário 'u2':Certifique-se de que estamos executando como o usuário inicial (no meu caso, dbo)
Tente remover os
SELECT
direitos do usuáriou1
sem usar aCASCADE
opção, o que falhará:Adicione a
CASCADE
opção, que funciona:Veja se os outros usuários têm acesso à tabela de teste (eles não têm, pois revogamos o acesso usando a
CASCADE
opção):Volte para o usuário 'dbo', para que possamos conceder
SELECT
no objeto de teste aos usuários restantes:Confirme se os outros usuários têm acesso ao objeto de teste:
Limpe o objeto de teste e os usuários:
Parece ser algo a ser corrigido pela Microsoft. A única maneira que vejo é descartar os usuários afetados e recriá-los com as permissões necessárias ...
@++ ;)