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 / 192920
Accepted
Evaldas Buinauskas
Evaldas Buinauskas
Asked: 2017-12-13 05:08:13 +0800 CST2017-12-13 05:08:13 +0800 CST 2017-12-13 05:08:13 +0800 CST

Permissões de TRUNCATE TABLE do SQL Server

  • 772

É possível configurar o usuário do SQL Server para que ele não tenha acesso às instruções DDL, mas tenha acesso aos TRUNCATE TABLEcomandos de execução. Eu sei que nos bastidores é um DDL.

Não consegui encontrar isso nos motores de busca.

sql-server permissions
  • 4 4 respostas
  • 2535 Views

4 respostas

  • Voted
  1. Scott Hodgin - Retired
    2017-12-13T05:28:22+08:002017-12-13T05:28:22+08:00

    Você pode usar essa técnica de Jonathan Kehayias para criar um procedimento armazenado que permitirá ao usuário TRUNCATEuma tabela.

    Como diz Johathan:

    "Você não pode conceder truncar porque, por qualquer motivo, essa permissão não existe. O que você pode fazer é usar um procedimento armazenado e usar EXECUTE AS OWNER para contornar isso."

    Aqui está o código de exemplo do post acima.

    CREATE DATABASE foo
    GO
    
    CREATE LOGIN foobar
        WITH password = 'Pa$$w0rd';
    GO
    
    USE foo
    GO
    
    CREATE user foobar
    FROM LOGIN foobar;
    GO
    
    CREATE TABLE test (rowid INT identity)
    GO
    
    INSERT INTO test DEFAULT
    VALUES;
    GO
    
    SELECT *
    FROM test
    GO
    
    CREATE PROCEDURE dbo.truncate_test
        WITH EXECUTE AS OWNER
    AS
    TRUNCATE TABLE test
    GO
    
    GRANT EXECUTE
        ON dbo.truncate_test
        TO foobar
    GO
    
    EXECUTE AS LOGIN = 'foobar'
    
    EXECUTE dbo.truncate_test
    
    REVERT
    GO
    
    SELECT *
    FROM test
    GO
    
    USE master
    GO
    
    DROP DATABASE foo
    
    DROP LOGIN foobar
    
    • 6
  2. Best Answer
    Edgar Allan Bayron
    2017-12-13T05:19:49+08:002017-12-13T05:19:49+08:00

    Não é possível conceder TRUNCATE sem conceder ALTER ao usuário.

    Embora você possa ter uma solução alternativa, concedendo DELETE ao usuário.

    • 2
  3. Solomon Rutzky
    2017-12-13T08:36:27+08:002017-12-13T08:36:27+08:00

    Eu sugeriria usar a assinatura de módulo para fazer isso, pois, no final, é a opção mais granular e mais segura. Isso é semelhante à opção de representação sugerida por @Scott , pois envolve a funcionalidade desejada em um procedimento armazenado, mas é menos problemático do que usar EXECUTE AS, pois não altera o contexto de segurança e as permissões elevadas são descartadas se alguém alterar um único byte do Procedimento Armazenado, forçando você a revisar a alteração e somente reaplicar as permissões se concordar com as alterações.

    Basta fazer o seguinte:

    1. Crie um procedimento armazenado que faça o TRUNCATE TABLEe o que mais precisa ser feito.

    2. No banco de dados em questão, crie um certificado (minha preferência é especificar uma senha em vez de confiar na chave mestra do banco de dados (DMK) para a proteção):

      CREATE CERTIFICATE [TruncatePermission]
      ENCRYPTION BY PASSWORD = 'password-123'
      WITH SUBJECT = 'Grant temporary db_owner status';
      
    3. Assine o procedimento armazenado com o certificado usando ADD SIGNATURE:

      ADD SIGNATURE
        TO dbo.[{new_Stored_Procedure_name}]
        BY CERTIFICATE [TruncatePermission]
        WITH PASSWORD = 'password-123';
      
    4. Faça backup do certificado para:

      • (um arquivo .cer para a Chave Pública, também conhecido como "Certificado", e um arquivo .pvk para a Chave Privada):

        BACKUP CERTIFICATE [TruncatePermission]
        TO FILE = 'path_to_public_key_(.cer)_file'  
        WITH PRIVATE KEY
        (
            FILE = 'path_to_private_key_(.pvk)_file',
            ENCRYPTION BY PASSWORD = 'password-123',
            DECRYPTION BY PASSWORD = 'password-123'
        );
        

      OU :

      • VARBINARYliterais usando funções internas:

        SELECT
          CERTENCODED(CERT_ID(N'TruncatePermission')) AS [Cert/PublicKey],
          CERTPRIVATEKEY(CERT_ID(N'TruncatePermission'),
                         'password-123', 'password-123') AS [PrivateKey];
        
    5. Remova a chave privada do certificado usando ALTER CERTIFICATEpara evitar que qualquer outra coisa seja assinada com o certificado (embora não seja um alto risco, pois eles também precisariam da senha):

      ALTER CERTIFICATE [TruncatePermission]
          REMOVE PRIVATE KEY;
      
    6. Crie um usuário a partir desse certificado:

      CREATE USER [Mr.Truncate] FROM CERTIFICATE [TruncatePermission];
      
    7. Conceda a esse usuário quaisquer permissões necessárias para atingir a meta. Tente encontrar a permissão menos privilegiada / mais restritiva que funcione, mas neste caso pode exigir "dbo" (através da db_ownerfunção de banco de dados fixa):

      ALTER ROLE [db_owner] ADD MEMBER [Mr.Truncate];
      
    8. Conceda EXECUTEo Procedimento Armazenado a qualquer combinação de Usuários e/ou Funções que possa realizar esta operação.

    As permissões concedidas ao usuário baseado em certificado são um pouco demais, mas esse usuário não pode ser representado (ou seja, EXECUTE AS USER = N'Mr.Truncate';) e não pode fazer login; esse Usuário é apenas um container para as permissões extras, e essas apenas se aplicam ao que foi assinado com aquele Certificado, que neste caso é apenas um Stored Procedure.

    Se você precisar alterar o código nesse procedimento armazenado ou conceder essas permissões a outro módulo por meio de assinatura com ADD SIGNATURE, precisará criar esse mesmo certificado em outro banco de dados se o novo código a ser assinado estiver em outro banco de dados ou precisará restaurar a Chave Privada neste Certificado usando a ALTER CERTIFICATEinstrução.

    • 2
  4. user_0
    2017-12-13T05:15:15+08:002017-12-13T05:15:15+08:00

    Você precisa de permissão para a tabela ALTER.

    Você pode encontrá-lo aqui: https://technet.microsoft.com/en-us/library/ms177570(v=sql.105).aspx

    em: Permissões.

    • 0

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