Eu tenho uma conta SQL com as seguintes permissões em um banco de dados:
A db_executor
função da qual você vê esta conta como membro foi criada por este script:
CREATE ROLE [db_executor] AUTHORIZATION [dbo]
GO
GRANT EXECUTE TO [db_executor]
GO
Quando executo um select
, update
, insert
ou delete
na mesa, funciona bem. Quando tento truncate
a tabela, ele me dá esta mensagem de erro:
Não é possível localizar o objeto "TableName" porque ele não existe ou você não tem permissões.
Qual permissão esta conta está faltando?
O melhor lugar para procurar esta informação é em livros online. O artigo
TRUNCATE TABLE
aqui indica:Portanto, ALTER é a permissão mínima necessária. Você pode obter isso como DB Owner, você pode obter isso como DB_DDLAdmin. Ou apenas conceda alterar.
Se você pensar no que truncate faz e como funciona, isso faz sentido, é um comando bastante "severo" e esvazia a tabela de dados e faz isso rapidamente.
De acordo com esta referência em BOL :
Você pode criar um procedimento armazenado com executar como proprietário para apenas uma tabela ou um procedimento armazenado para qualquer tabela. No próximo código está o procedimento armazenado para truncar qualquer tabela sem atribuir permissão de
db_owner
ou outro:Você pode criar um procedimento armazenado com executar como proprietário para apenas uma tabela ou um procedimento armazenado para qualquer tabela. No próximo código está o procedimento armazenado para truncar qualquer tabela sem atribuir permissão de db_owner ou outro. Nesta versão do SP está incluído tratamento de erros e prevenção de SQL Injection
Tanto quanto eu entendo, Truncar não é algo que você pode reverter. Portanto, a transação Begin Transaction/Commit é desnecessária.