É 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 TABLE
comandos de execução. Eu sei que nos bastidores é um DDL.
Não consegui encontrar isso nos motores de busca.
É 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 TABLE
comandos de execução. Eu sei que nos bastidores é um DDL.
Não consegui encontrar isso nos motores de busca.
Você pode usar essa técnica de Jonathan Kehayias para criar um procedimento armazenado que permitirá ao usuário
TRUNCATE
uma tabela.Como diz Johathan:
Aqui está o código de exemplo do post acima.
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.
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:
Crie um procedimento armazenado que faça o
TRUNCATE TABLE
e o que mais precisa ser feito.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):
Assine o procedimento armazenado com o certificado usando
ADD SIGNATURE
: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):
OU :
VARBINARY
literais usando funções internas:Remova a chave privada do certificado usando
ALTER CERTIFICATE
para evitar que qualquer outra coisa seja assinada com o certificado (embora não seja um alto risco, pois eles também precisariam da senha):Crie um usuário a partir desse certificado:
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_owner
função de banco de dados fixa):Conceda
EXECUTE
o 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 aALTER CERTIFICATE
instrução.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.