it-swarm.com.de

Welche Berechtigungen sind zum Abschneiden einer Tabelle erforderlich?

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

enter image description here

Das db_executor Die Rolle, in der dieses Konto Mitglied ist, wurde von diesem Skript erstellt:

CREATE ROLE [db_executor] AUTHORIZATION [dbo]
GO

GRANT EXECUTE TO [db_executor] 
GO

Wenn ich ein select, update, insert oder delete für die Tabelle ausführe, funktioniert es einwandfrei. Wenn ich versuche, die Tabelle zu truncate, 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?

14
Mansfield

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

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.

26
Mike Walsh

Gemäß diese Referenz in BOL :

Die erforderliche Mindestberechtigung ist ALTER für Tabellenname . TRUNCATE TABLE-Berechtigungen sind standardmäßig auf den Tabellenbesitzer , Mitglieder des sysadmin festgelegt Serverrolle und 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.

12
Thomas Stringer

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 andere:

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;
3
user3854427

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;
0
Yimy

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

0
Brian Clark