Jakie uprawnienia są niezbędne do obcinania tabeli?


14

Mam konto SQL z następującymi uprawnieniami w bazie danych:

wprowadź opis zdjęcia tutaj

db_executorRola widać to konto będąc członkiem został stworzony przez ten skrypt:

CREATE ROLE [db_executor] AUTHORIZATION [dbo]
GO

GRANT EXECUTE TO [db_executor] 
GO

Kiedy uruchomić select, update, insertlub deletena stole, to działa dobrze. Gdy próbuję przejść truncatedo tabeli, pojawia się następujący komunikat o błędzie:

Nie można znaleźć obiektu „TableName”, ponieważ nie istnieje lub nie masz uprawnień.

Jakiego uprawnienia brakuje na tym koncie?


TRUNCATE TABLEto DDL, a nie DML.
RBarryYoung

Odpowiedzi:


26

Najlepszym miejscem do poszukiwania tych informacji są książki online. Artykuł TRUNCATE TABLE tutaj wskazuje:

Wymagane minimalne uprawnienia to ALTER na nazwa_tabeli. TRUNCATE TABLE uprawnienia domyślnie dla właściciela tabeli, członków sysadmin ustalonej roli serwera oraz db_owner i db_ddladmin ustalonych ról bazy danych i nie można ich przenosić. Można jednak włączyć instrukcję TRUNCATE TABLE do modułu, na przykład procedurę przechowywaną, i przyznać odpowiednie uprawnienia modułowi za pomocą klauzuli EXECUTE AS.

ALTER to wymagane minimalne uprawnienia. Możesz uzyskać to jako właściciel DB, możesz uzyskać jako DB_DDLAdmin. Lub po prostu przyznaj alter.

Jeśli pomyślisz o tym, co robi obcinanie i jak działa, ma to sens, jest to dość „surowe” polecenie, które opróżnia tabelę danych i robi to szybko.


12

Zgodnie z tym odniesieniem w BOL :

Wymagane minimalne uprawnienia to ALTER na nazwa_tabeli . TRUNCATE TABLE uprawnienia domyślnie dla właściciela tabeli , członków sysadmin ustalonej roli serwera oraz db_owner i db_ddladmin ustalonych ról bazy danych i nie można ich przenosić. Można jednak włączyć instrukcję TRUNCATE TABLE do modułu, na przykład procedurę przechowywaną, i przyznać odpowiednie uprawnienia modułowi za pomocą klauzuli EXECUTE AS.


3

Możesz utworzyć procedurę przechowywaną z wykonaniem jako właściciel tylko jednej tabeli lub procedurą przechowywaną do dowolnej tabeli. W następnym kodzie jest przechowywana procedura do obcinania dowolnej tabeli bez udzielania zgody db_ownerlub innych:

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;

to dobry pomysł, ale można go poprawić. na przykład, dodając try..catch, kolejną rzeczą jest sprawdzanie ograniczeń, zwłaszcza kluczy obcych, a także pól tożsamości, należy je zresetować. możesz mieć to wszystko w swojej procedurze. jeśli to zrobisz, udostępnij nowy kod. ;)
Marcello Miorelli,

1

Możesz utworzyć procedurę przechowywaną z wykonaniem jako właściciel tylko jednej tabeli lub procedurą przechowywaną do dowolnej tabeli. W następnym kodzie jest przechowywana procedura do obcinania dowolnej tabeli bez udzielania zgody db_owner lub innej. W tej wersji SP zawarto obsługę błędów i zapobieganie iniekcji 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
Wygląda to bardzo podobnie do kodu w innej odpowiedzi. Czy jesteś tym samym użytkownikiem?
ypercubeᵀᴹ

@ ypercubeᵀᴹ - rozwija poprzednią odpowiedź, dodając kod chroniący przed wstrzyknięciem SQL.
Graeme

-1

O ile rozumiem, Ścinanie nie jest czymś, co można cofnąć. Dlatego rozpoczęcie transakcji / zatwierdzenie transakcji nie jest konieczne.


to nie jest prawda i łatwo ją przetestować, usuń \ zmień tę odpowiedź
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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.