2011-01-19 8 views
38

Quale autorizzazione è necessaria per GRANTARE un utente, in MSSQL, per poter troncare una tabella?Autorizzazioni per il troncamento di una tabella

Sto provando a concedere il set minimo di autorizzazioni, ma non posso usare DELETE, perché la tabella è molto grande e voglio che l'operazione sia veloce.

risposta

68

È necessaria l'autorizzazione ALTER: vedere Autorizzazioni sezione here.

Si noti che è anche possibile utilizzare una stored procedure con EXECUTE AS, in modo che l'utente che esegue la stored procedure non debba nemmeno ottenere il permesso ALTER.

+1

Non solo questa risposta corretta, ma ha fatto il "insegnare ad un uomo a pescare" puntando alla documentazione in modo da tali risposte possono essere trovate dal l'OP in futuro. Perché il downvote? –

+2

@ Ben - Ho il sospetto che l'OP abbia postato questa risposta circa un nanosecondo dopo aver postato la domanda. Non ho fatto downvote anche se le FAQ lo consentono. –

+0

@ Martin - non era un nanosecondo. Sono passati 2 minuti: è così che mi ci è voluto per trovare la risposta. –

8

L'autorizzazione minima richiesta è ALTER su nome_tabella. TRUNCATE TABLE i permessi di default per il proprietario della tabella , i membri del sysadmin ruolo del server, e il db_owner e db_ddladmin fisso ruoli di database, e non sono trasferibili. Tuttavia, è possibile incorporare l'istruzione TRUNCATE TABLE all'interno di un modulo, ad esempio una stored procedure , e concedere le autorizzazioni appropriate al modulo utilizzando la clausola EXECUTE AS. Per ulteriori informazioni su , vedere Utilizzo di EXECUTE AS su Creazione di set di autorizzazioni personalizzate.

Source

1

non concedono, nascondere ...

CREATE TRIGGER TRG_MyTable_Foo 
WITH EXECUTE AS OWNER 
INSTEAD OF DELETE 
AS 
IF CONTEXT_INFO() = 0x9999 
BEGIN 
    TRUNCATE TABLE MyTable 
    SET CONTEXT_INFO 0x00 
END 
GO 

SET CONTEXT_INFO 0x9999 
DELETE MyTable WHERE 1=0 

SET CONTEXT_INFO può essere è senza alcun dubbio meglio per separare un normale DELETE da una tabella TRUNCATE

Non ho provato questo ...

Modifica: modificato per utilizzare SET CONTEXT_INFO.

+0

+1 Avrei detto "SET CONTEXT_INFO" sarebbe stato un must per evitare di provocare spiacevoli sorprese! –

+1

-1 Questo farebbe una cancellazione che colpisce zero righe troncare la tabella. Di solito sei un grande sostenitore, ma questo è un imbroglio irraggiungibile. – Andomar

+0

@Andomar: sì, corretto. Non ci ho pensato né completamente né aggiornato la mia risposta abbastanza rapidamente – gbn

7

È possibile creare una stored procedure with execute as owner:

create procedure dbo.TruncTable 
with execute as owner 
as 
truncate table TheTable 
go 

quindi concedere permessi di esecuzione per chi ha bisogno di troncare quel tavolo:

grant execute on TruncTable to TheUser 

Ora TheUser può troncare la tabella come:

exec dbo.TruncTable 
0

È possibile creare una stored procedure con exec ute in qualità di titolare di una sola tabella o di una procedura di memorizzazione a qualsiasi tavolo:

CREATE 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; 
+5

Questo è pericoloso! – Graeme