Quali autorizzazioni sono necessarie per troncare una tabella?


14

Ho un account SQL con le seguenti autorizzazioni su un database:

inserisci qui la descrizione dell'immagine

Il db_executorruolo a cui vedi questo account come membro è stato creato da questo script:

CREATE ROLE [db_executor] AUTHORIZATION [dbo]
GO

GRANT EXECUTE TO [db_executor] 
GO

Quando eseguo un select, update, inserto deletesul tavolo, funziona benissimo. Quando provo al truncatetavolo, mi dà questo messaggio di errore:

Impossibile trovare l'oggetto "TableName" perché non esiste o non si dispone delle autorizzazioni.

Quale autorizzazione manca questo account?


TRUNCATE TABLEè DDL, non DML.
RBarryYoung,

Risposte:


26

Il posto migliore per cercare queste informazioni è nei libri online. L'articolo TRUNCATE TABLE qui indica:

L'autorizzazione minima richiesta è ALTER su table_name. Autorizzazioni TRUNCATE TABLE predefinite per il proprietario della tabella, i membri del ruolo predefinito del server sysadmin e i ruoli fissi del database db_owner e db_ddladmin e non sono trasferibili. Tuttavia, è possibile incorporare l'istruzione TRUNCATE TABLE in un modulo, ad esempio una procedura memorizzata, e concedere le autorizzazioni appropriate al modulo utilizzando la clausola EXECUTE AS.

Quindi ALTER è il permesso minimo richiesto. Puoi ottenerlo come DB Owner, puoi ottenerlo come DB_DDLAdmin. O semplicemente concedi l'alter.

Se pensi a cosa fa il troncamento e come funziona, questo ha senso, è un comando piuttosto "grave" e svuota la tabella dei dati e lo fa rapidamente.


12

Secondo questo riferimento in BOL :

L'autorizzazione minima richiesta è ALTER su table_name . Autorizzazioni TRUNCATE TABLE predefinite per il proprietario della tabella , i membri del ruolo predefinito del server sysadmin e i ruoli fissi del database db_owner e db_ddladmin e non sono trasferibili. Tuttavia, è possibile incorporare l'istruzione TRUNCATE TABLE in un modulo, ad esempio una procedura memorizzata, e concedere le autorizzazioni appropriate al modulo utilizzando la clausola EXECUTE AS.


3

È possibile creare una procedura memorizzata con esegui come proprietario su una sola tabella o una procedura memorizzata su qualsiasi tabella. Nel codice successivo è memorizzata la procedura per troncare qualsiasi tabella senza fornire l'autorizzazione db_ownero altro:

USE [database name]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:      Yimy Orley Asprilla
-- Create date: Julio 16 de 2014
-- Description: Función para hacer TRUNCATE a una tabla.
-- =============================================
ALTER PROCEDURE [dbo].[spTruncate]
    @nameTable varchar(60)  


WITH EXECUTE AS OWNER
AS

    SET NOCOUNT OFF;

    DECLARE @QUERY NVARCHAR(200);

    SET @QUERY = N'TRUNCATE TABLE ' + @nameTable + ';'


    EXECUTE sp_executesql @QUERY;

questa è una buona idea, ma potrebbe essere ben migliorata. per esempio, aggiungendo try..catch, un'altra cosa sta verificando i vincoli, specialmente le chiavi esterne, anche i campi di identità, devono essere ridimensionati. puoi avere tutto ciò nella tua procedura. se lo fai, condividi il nuovo codice. ;)
Marcello Miorelli,

1

È possibile creare una procedura memorizzata con esegui come proprietario su una sola tabella o una procedura memorizzata su qualsiasi tabella. Nel codice successivo è memorizzata la procedura per troncare qualsiasi tabella senza fornire l'autorizzazione di db_owner o altro. In questa versione di SP è inclusa la gestione degli errori e la prevenzione dell'iniezione SQL

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


/****** Se validan el parametro de entrada @strTabla para evitar un SQL inyección, Yimy Asprilla ******/
CREATE PROCEDURE [dbo].[spTruncate] 
        @strTabla VARCHAR(50)
WITH EXECUTE AS OWNER
AS
-- =============================================
 -- Author:  Yimy Asprilla
 -- Create date: Julio 16 de 2014
 -- Update: September 21 2017
 -- Description: Función para hacer TRUNCATE a una tabla si ser owner de la tabla. con manejo de errores y SQL Inyection
 -- =============================================
SET NOCOUNT ON

DECLARE @strSQL VARCHAR(500);
DECLARE @object_id int;

SET @object_id = OBJECT_ID(@strTabla);

BEGIN TRY
    IF @object_id IS NOT NULL 
        BEGIN;
            BEGIN TRANSACTION;
            SET @strSQL = 'TRUNCATE TABLE [' + @strTabla + '];'
            EXECUTE (@strSQL);
            COMMIT TRANSACTION;
        END;
    ELSE
    BEGIN;
        PRINT N'La Tabla: ' + @strTabla + ' No existe';
    END;
END TRY
BEGIN CATCH  
    -- se presento un error en la ejcución y s epresenta
    PRINT N'Se presento el error: ';
    SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_MESSAGE() AS ErrorMessage;   
END CATCH;

1
Sembra molto simile al codice in un'altra risposta. Sei lo stesso utente di quello?
ypercubeᵀᴹ

@ ypercubeᵀᴹ - Si sta espandendo sulla risposta precedente aggiungendo codice per proteggere dall'iniezione SQL.
Graeme,

-1

Per quanto ho capito Troncare non è qualcosa che puoi ripristinare. Pertanto la transazione Begin / Commit Transaction non è necessaria.


questo non è vero ed è facile da testare per favore cancella \ cambia questa risposta
Marcello Miorelli

BEGIN TRANSACTION RADHE SELECT @@TRANCOUNT select * from [dbo].[mytable] truncate table [dbo].[mytable] rollback select * from [dbo].[mytable] /*COMMIT TRAN RADHE*/ SELECT @@TRANCOUNT
Marcello Miorelli,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.