AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 121531
Accepted
stergosz
stergosz
Asked: 2015-11-19 14:30:05 +0800 CST2015-11-19 14:30:05 +0800 CST 2015-11-19 14:30:05 +0800 CST

SQL Server REVOKE requer CASCADE

  • 772

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.

sql-server permissions
  • 2 2 respostas
  • 5897 Views

2 respostas

  • Voted
  1. Best Answer
    Hannah Vernon
    2015-11-21T09:40:37+08:002015-11-21T09:40:37+08:00

    Quando você concede permissões a um usuário usando a WITH GRANT OPTIONcláusula e subsequentemente revoga essa permissão, o SQL Server impedirá a revogação, a menos que você adicione explicitamente a CASCADEopção à REVOKE ...instrução.

    Isso evita um risco de segurança pelo qual você concede WITH GRANT OPTIONa 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 a CASCADEopção:

    Msg 4611, Nível 16, Estado 1, Linha 44

    Para revogar ou negar privilégios concedíveis, especifique a opção CASCADE.

    Para revogar as permissões que foram concedidas usando a WITH GRANT OPTIONcláusula, você deve revogar a permissão usando a CASCADEopção. Isso também remove os direitos revogados de todos os usuários que receberam os direitos do usuário com o GRANT OPTION. Se você deseja que esses outros usuários mantenham os direitos concedidos pelo usuário com o GRANT 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:

    IF OBJECT_ID('dbo.TestSelect') IS NULL
    CREATE TABLE dbo.TestSelect
    (
        t INT
    );
    

    Crie três usuários:

    IF NOT EXISTS (
        SELECT 1 
        FROM sys.database_principals dp 
        WHERE dp.name = 'u1')
    CREATE USER u1 WITHOUT LOGIN;
    
    IF NOT EXISTS (
        SELECT 1 
        FROM sys.database_principals dp 
        WHERE dp.name = 'u2')
    CREATE USER u2 WITHOUT LOGIN;
    
    IF NOT EXISTS (
        SELECT 1 
        FROM sys.database_principals dp 
        WHERE dp.name = 'u3')
    CREATE USER u3 WITHOUT LOGIN;
    

    Conceder SELECT WITH GRANT OPTIONao usuário u1:

    GRANT SELECT ON dbo.TestSelect TO u1 WITH GRANT OPTION;
    

    Conceda SELECT WITH GRANT OPTIONao usuário u2como usuário 'u1':

    EXECUTE AS USER = 'u1';
    
    GRANT SELECT ON dbo.TestSelect TO u2 WITH GRANT OPTION;
    
    REVERT
    

    Conceda SELECT WITH GRANT OPTIONao usuário u3como usuário 'u2':

    EXECUTE AS USER = 'u2';
    
    GRANT SELECT ON dbo.TestSelect TO u3 WITH GRANT OPTION;
    
    REVERT
    

    Certifique-se de que estamos executando como o usuário inicial (no meu caso, dbo)

    SELECT USER_NAME();
    

    Tente remover os SELECTdireitos do usuário u1sem usar a CASCADEopção, o que falhará:

    REVOKE SELECT ON dbo.TestSelect FROM u1;
    --Msg 4611, Level 16, State 1, Line 44
    --To revoke or deny grantable privileges, specify the CASCADE option.
    

    Adicione a CASCADEopção, que funciona:

    REVOKE SELECT ON dbo.TestSelect FROM u1 CASCADE;
    

    Veja se os outros usuários têm acesso à tabela de teste (eles não têm, pois revogamos o acesso usando a CASCADEopção):

    EXECUTE AS USER = 'u2';
    
    SELECT *
    FROM dbo.TestSelect;
    --Msg 229, Level 14, State 5, Line 51
    --The SELECT permission was denied on the object 'TestSelect', database 'Test', schema 'dbo'.
    

    Volte para o usuário 'dbo', para que possamos conceder SELECTno objeto de teste aos usuários restantes:

    REVERT -- back to 'dbo'
    
    GRANT SELECT ON dbo.TestSelect TO U2;
    GRANT SELECT ON dbo.TestSelect TO U3;
    

    Confirme se os outros usuários têm acesso ao objeto de teste:

    EXECUTE AS USER = 'u2';
    
    SELECT *
    FROM dbo.TestSelect;
    
    REVERT -- back to 'dbo'
    
    EXECUTE AS USER = 'u3';
    
    SELECT *
    FROM dbo.TestSelect;
    
    REVERT -- back to 'dbo'
    

    Limpe o objeto de teste e os usuários:

    DROP TABLE dbo.TestSelect
    DROP USER u3;
    DROP USER u2;
    DROP USER u1;
    
    • 3
  2. Nicolas Souquet
    2015-11-19T23:03:56+08:002015-11-19T23:03:56+08:00

    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 ...

    @++ ;)

    • -1

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve