Bir tabloyu kısaltmak için hangi izinler gereklidir?


14

Bir veritabanında aşağıdaki izinlere sahip bir SQL hesabım var:

resim açıklamasını buraya girin

db_executorBu hesabı bu komut dosyası tarafından oluşturulan üye olmak bkz rolü:

CREATE ROLE [db_executor] AUTHORIZATION [dbo]
GO

GRANT EXECUTE TO [db_executor] 
GO

Ben çalıştırdığınızda select, update, insertveya deletemasada, bu cezayı çalışır. Tabloya çalıştığımda truncate, bana bu hata iletisini verir:

"TableName" nesnesi bulunamadığından veya izinleriniz olmadığından bulamıyorum.

Bu hesapta hangi izin eksik?


TRUNCATE TABLEDML değil DDL'dir.
RBarryYoung

Yanıtlar:


26

Bu bilgiyi aramak için en iyi yer çevrimiçi kitaplarda. Üzerinde makale TRUNCATE TABLE burada gösterir:

Gereken minimum izin tablo_adı ALTER'dir. TRUNCATE TABLE izinleri varsayılan olarak tablo sahibine, sysadmin sabit sunucu rolünün üyelerine ve db_owner ve db_ddladmin sabit veritabanı rollerine sahiptir ve aktarılamaz. Ancak, TRUNCATE TABLE deyimini saklı yordam gibi bir modülün içine dahil edebilir ve EXECUTE AS yan tümcesini kullanarak modüle uygun izinler verebilirsiniz.

Dolayısıyla ALTER gereken minimum izinlerdir. Bunu DB Sahibi olarak alabilirsiniz, DB_DDLAdmin olarak alabilirsiniz. Ya da sadece değişiklik verin.

Kesmenin ne yaptığını ve nasıl çalıştığını düşünürseniz, bu mantıklıdır, oldukça "ciddi" bir komuttur ve veri tablosunu boşaltır ve hızlı bir şekilde yapar.


12

Başı olarak BOL Bu referans :

Gereken minimum izin tablo_adı ALTER'dir . TRUNCATE TABLE izinleri varsayılan olarak tablo sahibine , sysadmin sabit sunucu rolünün üyelerine ve db_owner ve db_ddladmin sabit veritabanı rollerine sahiptir ve aktarılamaz. Ancak, TRUNCATE TABLE deyimini saklı yordam gibi bir modülün içine dahil edebilir ve EXECUTE AS yan tümcesini kullanarak modüle uygun izinleri verebilirsiniz.


3

Yalnızca bir tabloya sahip olarak yürütme ile saklı bir yordam ya da herhangi bir tabloya saklı yordam oluşturabilirsiniz. Bir sonraki kodda, herhangi bir tabloyu izin vermeden db_ownerveya diğerlerini kesmeden kısaltmak için saklı yordamda :

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;

bu iyi bir fikir, ama iyi geliştirilebilir. Örneğin, try..catch ekleyerek, başka bir şey kısıtlamaları, özellikle yabancı anahtarları, aynı zamanda kimlik alanlarını kontrol etmektir. tüm bunları prosedürünüzde yapabilirsiniz. bunu yaparsanız, yeni kodu paylaşın. ;)
Marcello Miorelli

1

Yalnızca bir tabloya sahip olarak yürütme ile saklı yordam veya herhangi bir tabloya saklı yordam oluşturabilirsiniz. Sonraki kodda db_owner veya diğer izin alamadan herhangi bir tabloyu kısaltmak için saklı yordam saklanır. SP'nin bu sürümünde hataların işlenmesi ve SQL Enjeksiyonunun önlenmesi dahildir

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
Bu, başka bir yanıttaki koda çok benziyor. Bu kullanıcıyla aynı kullanıcı mısınız?
ypercubeᵀᴹ

@ ypercubeᵀᴹ - SQL enjeksiyonuna karşı koruma için kod ekleyerek önceki cevabı genişletiyor.
Graeme

-1

Anladığım kadarıyla Truncate geri alabileceğiniz bir şey değil. Bu nedenle İşlem Başlatma / İşlem Tamamlama gerekli değildir.


bu doğru değil ve test etmek kolaydır lütfen bu cevabı silin \ değiştirin
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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.