Tengo una cuenta SQL con los siguientes permisos en una base de datos:
El db_executor
rol del que ves que esta cuenta es miembro fue creado por este script:
CREATE ROLE [db_executor] AUTHORIZATION [dbo]
GO
GRANT EXECUTE TO [db_executor]
GO
Cuando ejecuto una select
, update
, insert
o delete
en la mesa, que funciona bien. Cuando intento ir a truncate
la mesa, me da este mensaje de error:
No se puede encontrar el objeto "TableName" porque no existe o no tiene permisos.
¿Qué permiso le falta a esta cuenta?
sql-server
sql-server-2012
permissions
Mansfield
fuente
fuente
TRUNCATE TABLE
es DDL, no DML.Respuestas:
El mejor lugar para buscar esta información es en los libros en línea. El artículo
TRUNCATE TABLE
aquí indica:Entonces ALTER es los permisos mínimos requeridos. Puede obtener eso como DB Owner, puede obtener eso como DB_DDLAdmin. O simplemente conceder alter.
Si piensa en lo que hace truncar y cómo funciona, esto tiene sentido, es un comando bastante "severo" y vacía la tabla de datos y lo hace rápidamente.
fuente
Según esta referencia en BOL :
fuente
Puede crear un procedimiento almacenado con ejecutar como propietario para una sola tabla o un procedimiento almacenado para cualquier tabla. En el siguiente código se almacena el procedimiento para truncar cualquier tabla sin dar permiso
db_owner
u otro:fuente
Puede crear un procedimiento almacenado con ejecutar como propietario para una sola tabla o un procedimiento almacenado para cualquier tabla. En el siguiente código se almacena el procedimiento para truncar cualquier tabla sin dar permiso a db_owner u otro. En esta versión de SP se incluye el manejo de errores y la prevención de inyección SQL
fuente
Por lo que yo entiendo, Truncar no es algo que pueda revertir. Por lo tanto, la transacción de inicio / transacción de confirmación es innecesaria.
fuente
BEGIN TRANSACTION RADHE SELECT @@TRANCOUNT select * from [dbo].[mytable] truncate table [dbo].[mytable] rollback select * from [dbo].[mytable] /*COMMIT TRAN RADHE*/ SELECT @@TRANCOUNT