Usuário com melhor resposta
Revoke permissão sem efeito cascata?

Pergunta
-
Boa tarde pessoal!
Possuo um usuário que tem permissão de executar uma determinada procedure e também tem o direito de conceder permissão para executar esta procedure.
Gostaria de saber se é possível utilizar o REVOKE na permissão de executar a procedure deste usuário, sem afetar a mesma permissão que este usuário concedeu para outros usuários?
Resumindo: quero dar um revoke na permissão deste usuário, mas sem que afete as permissões que ele concedeu a outros usuário.
Respostas
-
Boa Noite,
É possível conceder permissões com a opção WITH GRANT OPTION para que um usuário que recebeu uma determinada permissão, possa repassar essa permissão. Entretanto, por uma questão de segurança, caso o usuário tenha recebido a permissão e repassado-a, quando este a perde, todos os usuários que receberam a permissão através do repasse também a perdem. Não há como mudar esse comportamento (que não é exclusivo do SQL Server, mas de muitos SGBDs). Se você quer que os usuários mantenham sua permissão, o ideal é que você conceda todas as permissões por si só (WITH GRANT OPTION é uma opção DEPRECATED e insegura). Segue um exemplo:
-- Muda o contexto de banco de dados
USE tempdb-- Cria um usuário Usr1
CREATE USER Usr1 WITHOUT LOGIN-- Cria um usuário Usr2
CREATE USER Usr2 WITHOUT LOGIN-- Cria uma tabela
CREATE TABLE T (ID INT)
INSERT INTO T VALUES (1)-- Concede permissão ao usuário Usr1
GRANT SELECT ON T TO Usr1 WITH GRANT OPTION-- Muda o contexto para Usr1
EXECUTE AS USER = 'Usr1'-- Faz o SELECT
SELECT ID FROM T-- O usuário Usr1 repassa a permissão
GRANT SELECT ON T TO Usr2 WITH GRANT OPTION-- Volta ao usuário Principal
REVERT-- Muda o contexto para o usuário Usr2
EXECUTE AS USER = 'Usr2'-- Faz o SELECT
SELECT ID FROM T-- Volta ao usuário Principal
REVERT-- Consulta as permissões
SELECT USER_NAME(grantee_principal_id), OBJECT_NAME(major_id), permission_name, STATE_DESC
FROM sys.database_permissions WHERE major_id = OBJECT_ID('T')-- Retira a permissão do Usr1 somente (ocorre um erro)
REVOKE SELECT ON T TO Usr1-- Como a permissão foi com GRANT OPTION, é preciso Cascata
REVOKE SELECT ON T TO Usr1 CASCADE-- Consulta as permissões
SELECT USER_NAME(grantee_principal_id), OBJECT_NAME(major_id), permission_name, STATE_DESC
FROM sys.database_permissions WHERE major_id = OBJECT_ID('T')-- Usr2 perdeu a permissão
-- Muda o contexto para o usuário Usr2
EXECUTE AS USER = 'Usr2'-- Faz o SELECT
SELECT ID FROM T-- Volta ao usuário Principal
REVERT-- Elimina os usuários
DROP USER Usr1
DROP USER Usr2-- Mata o objeto
DROP TABLE T[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.wordpress.com
Classifique as respostas. O seu feedback é imprescindível- Sugerido como Resposta Gustavo Maia Aguiar sexta-feira, 15 de julho de 2011 04:02
- Marcado como Resposta Flavio Andrade Machado sexta-feira, 15 de julho de 2011 12:41
Todas as Respostas
-
Leivo, eu fiz o teste e afetou sim.
Na verdade eu tentei primeiro revogar a permissão, então o SQL Server reclama pedindo que eu use o CASCADE, e se eu uso este comando ele tira as permissões também daqueles que receberam a permissão do determinado usuário.
-
Boa Noite,
É possível conceder permissões com a opção WITH GRANT OPTION para que um usuário que recebeu uma determinada permissão, possa repassar essa permissão. Entretanto, por uma questão de segurança, caso o usuário tenha recebido a permissão e repassado-a, quando este a perde, todos os usuários que receberam a permissão através do repasse também a perdem. Não há como mudar esse comportamento (que não é exclusivo do SQL Server, mas de muitos SGBDs). Se você quer que os usuários mantenham sua permissão, o ideal é que você conceda todas as permissões por si só (WITH GRANT OPTION é uma opção DEPRECATED e insegura). Segue um exemplo:
-- Muda o contexto de banco de dados
USE tempdb-- Cria um usuário Usr1
CREATE USER Usr1 WITHOUT LOGIN-- Cria um usuário Usr2
CREATE USER Usr2 WITHOUT LOGIN-- Cria uma tabela
CREATE TABLE T (ID INT)
INSERT INTO T VALUES (1)-- Concede permissão ao usuário Usr1
GRANT SELECT ON T TO Usr1 WITH GRANT OPTION-- Muda o contexto para Usr1
EXECUTE AS USER = 'Usr1'-- Faz o SELECT
SELECT ID FROM T-- O usuário Usr1 repassa a permissão
GRANT SELECT ON T TO Usr2 WITH GRANT OPTION-- Volta ao usuário Principal
REVERT-- Muda o contexto para o usuário Usr2
EXECUTE AS USER = 'Usr2'-- Faz o SELECT
SELECT ID FROM T-- Volta ao usuário Principal
REVERT-- Consulta as permissões
SELECT USER_NAME(grantee_principal_id), OBJECT_NAME(major_id), permission_name, STATE_DESC
FROM sys.database_permissions WHERE major_id = OBJECT_ID('T')-- Retira a permissão do Usr1 somente (ocorre um erro)
REVOKE SELECT ON T TO Usr1-- Como a permissão foi com GRANT OPTION, é preciso Cascata
REVOKE SELECT ON T TO Usr1 CASCADE-- Consulta as permissões
SELECT USER_NAME(grantee_principal_id), OBJECT_NAME(major_id), permission_name, STATE_DESC
FROM sys.database_permissions WHERE major_id = OBJECT_ID('T')-- Usr2 perdeu a permissão
-- Muda o contexto para o usuário Usr2
EXECUTE AS USER = 'Usr2'-- Faz o SELECT
SELECT ID FROM T-- Volta ao usuário Principal
REVERT-- Elimina os usuários
DROP USER Usr1
DROP USER Usr2-- Mata o objeto
DROP TABLE T[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.wordpress.com
Classifique as respostas. O seu feedback é imprescindível- Sugerido como Resposta Gustavo Maia Aguiar sexta-feira, 15 de julho de 2011 04:02
- Marcado como Resposta Flavio Andrade Machado sexta-feira, 15 de julho de 2011 12:41
-