Welche Berechtigungen sind zum Abschneiden einer Tabelle erforderlich?

14

Ich habe ein SQL-Konto mit den folgenden Berechtigungen für eine Datenbank:

Geben Sie hier die Bildbeschreibung ein

Die db_executorRolle, in der dieses Konto Mitglied ist, wurde von diesem Skript erstellt:

CREATE ROLE [db_executor] AUTHORIZATION [dbo]
GO

GRANT EXECUTE TO [db_executor] 
GO

Als ich ein laufen select, update, insertoder deleteauf dem Tisch, es funktioniert gut. Wenn ich versuche, truncatedie Tabelle aufzurufen, wird folgende Fehlermeldung angezeigt:

Das Objekt "TableName" kann nicht gefunden werden, da es nicht vorhanden ist oder Sie keine Berechtigungen haben.

Welche Berechtigung fehlt diesem Konto?

Mansfield
quelle
TRUNCATE TABLEist DDL, nicht DML.
RBarryYoung

Antworten:

26

Der beste Ort, um nach diesen Informationen zu suchen, sind Bücher online. Der Artikel TRUNCATE TABLE hier zeigt:

Die erforderliche Mindestberechtigung ist ALTER für Tabellenname. Die Berechtigungen TRUNCATE TABLE gelten standardmäßig für den Tabellenbesitzer, die Mitglieder der festen Serverrolle sysadmin sowie die festen Datenbankrollen db_owner und db_ddladmin und sind nicht übertragbar. Sie können jedoch die Anweisung TRUNCATE TABLE in ein Modul einbinden, z. B. in eine gespeicherte Prozedur, und dem Modul mithilfe der EXECUTE AS-Klausel die entsprechenden Berechtigungen erteilen.

ALTER ist also die erforderliche Mindestberechtigung. Sie können das als DB-Besitzer bekommen, Sie können das als DB_DDLAdmin bekommen. Oder gewähren Sie einfach alter.

Wenn Sie darüber nachdenken, was das Abschneiden bewirkt und wie es funktioniert, ist dies sinnvoll. Es ist ein ziemlich "strenger" Befehl, der die Datentabelle leert und dies schnell erledigt.

Mike Walsh
quelle
12

Gemäß dieser Referenz in BOL :

Die erforderliche Mindestberechtigung ist ALTER für Tabellenname . TRUNCATE TABLE - Berechtigungen standardmäßig dem Tabelleneigentümer , die Mitglieder der Sysadmin - Serverrolle fixiert und die db_owner und db_ddladmin festen Datenbankrollen, und sind nicht übertragbar. Sie können jedoch die Anweisung TRUNCATE TABLE in ein Modul einbinden, z. B. in eine gespeicherte Prozedur, und dem Modul mithilfe der EXECUTE AS-Klausel die entsprechenden Berechtigungen erteilen.

Thomas Stringer
quelle
3

Sie können eine gespeicherte Prozedur mit Ausführen als Eigentümer für nur eine Tabelle oder eine gespeicherte Prozedur für eine Tabelle erstellen. Im nächsten Code wird eine Prozedur zum Abschneiden einer Tabelle gespeichert, ohne die Erlaubnis von db_owneroder einer anderen zu erteilen :

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;
user3854427
quelle
Das ist eine gute Idee, aber sie könnte gut verbessert werden. Wenn Sie beispielsweise try..catch hinzufügen, müssen Sie auch nach Einschränkungen suchen, insbesondere nach Fremdschlüsseln und Identitätsfeldern, die neu festgelegt werden müssen. Sie können all das in Ihrem Verfahren haben. Wenn Sie dies tun, teilen Sie den neuen Code. ;)
Marcello Miorelli
0

Sie können eine gespeicherte Prozedur mit Ausführen als Eigentümer für nur eine Tabelle oder eine gespeicherte Prozedur für eine Tabelle erstellen. Im nächsten Code wird eine Prozedur zum Abschneiden einer Tabelle gespeichert, ohne die Erlaubnis von db_owner oder einer anderen zu erteilen. In dieser Version von SP ist die Behandlung von Fehlern und die Verhinderung von SQL Injection enthalten

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;
Yimy
quelle
1
Dies sieht dem Code in einer anderen Antwort sehr ähnlich. Sind Sie der gleiche Benutzer wie dieser?
Ypercubeᵀᴹ
0

Soweit ich weiß, können Sie das Zurückschneiden nicht rückgängig machen. Daher ist die Transaktion "Transaktion starten / festschreiben" nicht erforderlich.

Brian Clark
quelle