สิทธิ์ใดที่จำเป็นสำหรับการตัดทอนตาราง


14

ฉันมีบัญชี SQL ที่มีสิทธิ์ต่อไปนี้ในฐานข้อมูล:

ป้อนคำอธิบายรูปภาพที่นี่

db_executorบทบาทที่คุณเห็นบัญชีนี้เป็นสมาชิกของถูกสร้างขึ้นโดยสคริปต์นี้:

CREATE ROLE [db_executor] AUTHORIZATION [dbo]
GO

GRANT EXECUTE TO [db_executor] 
GO

เมื่อผมทำงานselect, update, insertหรือdeleteบนโต๊ะทำงานดี เมื่อฉันลองtruncateโต๊ะมันทำให้ฉันเกิดข้อผิดพลาดนี้:

ไม่พบวัตถุ "TableName" เนื่องจากไม่มีอยู่หรือคุณไม่มีสิทธิ์ใช้งาน

บัญชีนี้ได้รับอนุญาตอะไรหายไป?


TRUNCATE TABLEคือ DDL ไม่ใช่ DML
RBarryYoung

คำตอบ:


26

สถานที่ที่ดีที่สุดในการค้นหาข้อมูลนี้อยู่ในหนังสือออนไลน์ บทความที่TRUNCATE TABLE นี่ระบุ:

สิทธิ์ขั้นต่ำที่จำเป็นต้องมีคือ ALTER ใน table_name TRUNCATE TABLE สิทธิ์เริ่มต้นสำหรับเจ้าของตารางสมาชิกของบทบาทเซิร์ฟเวอร์ถาวร sysadmin และบทบาทฐานข้อมูลคงที่ db_owner และ db_ddladmin และไม่สามารถถ่ายโอนได้ อย่างไรก็ตามคุณสามารถรวมคำสั่ง TRUNCATE TABLE ภายในโมดูลเช่นโพรซีเดอร์ที่เก็บไว้และให้สิทธิ์ที่เหมาะสมกับโมดูลโดยใช้ส่วนคำสั่ง EXECUTE AS

ดังนั้นแก้ไขเป็นสิทธิ์ขั้นต่ำที่จำเป็น คุณสามารถรับได้ในฐานะเจ้าของ DB คุณสามารถรับได้ในฐานะ DB_DDLAdmin หรือเพียงแค่ให้การเปลี่ยนแปลง

หากคุณคิดเกี่ยวกับสิ่งที่ถูกตัดทอนและวิธีการทำงานสิ่งนี้เหมาะสมแล้วมันเป็นคำสั่ง "รุนแรง" ที่น่ารักและกำจัดสารบัญและทำมันอย่างรวดเร็ว


12

ตามการอ้างอิงนี้ใน BOL :

ได้รับอนุญาตขั้นต่ำที่จำเป็นคือการเปลี่ยนแปลงใน table_name TRUNCATE TABLE สิทธิ์เริ่มต้นสำหรับเจ้าของตารางสมาชิกของบทบาทเซิร์ฟเวอร์ถาวรsysadminและบทบาทฐานข้อมูลคงที่db_ownerและdb_ddladminและไม่สามารถถ่ายโอนได้ อย่างไรก็ตามคุณสามารถรวมคำสั่ง TRUNCATE TABLE ภายในโมดูลเช่นโพรซีเดอร์ที่เก็บไว้และให้สิทธิ์ที่เหมาะสมกับโมดูลโดยใช้ส่วนคำสั่ง EXECUTE AS


3

คุณสามารถสร้างกระบวนงานที่เก็บไว้ด้วยการดำเนินการในฐานะเจ้าของเพียงหนึ่งตารางหรือกระบวนงานที่เก็บไว้ในตารางใด ๆ ในรหัสถัดไปจะถูกจัดเก็บขั้นตอนการตัดทอนตารางใด ๆ โดยไม่ได้รับอนุญาตdb_ownerหรืออื่น ๆ :

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;

นี่เป็นความคิดที่ดี แต่อาจปรับปรุงได้ดี ตัวอย่างเช่นการเพิ่มลอง .. จับอีกสิ่งหนึ่งคือการตรวจสอบข้อ จำกัด คีย์ต่างประเทศโดยเฉพาะเช่นเดียวกับเขตข้อมูลตัวตนจำเป็นต้องดำเนินการอีกครั้ง คุณสามารถมีทุกอย่างที่อยู่ในขั้นตอนของคุณ หากคุณทำเช่นนั้นแบ่งปันรหัสใหม่ ;)
Marcello Miorelli

1

คุณสามารถสร้างกระบวนงานที่เก็บไว้ด้วยการดำเนินการในฐานะเจ้าของเพียงหนึ่งตารางหรือกระบวนงานที่เก็บไว้ในตารางใด ในรหัสถัดไปจะถูกเก็บไว้ในการตัดทอนตารางใด ๆ โดยไม่ได้รับอนุญาตจาก db_owner หรืออื่น ๆ ใน SP รุ่นนี้มีการจัดการข้อผิดพลาดและการป้องกัน SQL Injection

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
นี่ดูคล้ายกับรหัสในคำตอบอื่น คุณเป็นผู้ใช้คนเดียวกันหรือไม่?
ypercubeᵀᴹ

@ ypercubeᵀᴹ - เขากำลังขยายคำตอบก่อนหน้านี้โดยเพิ่มรหัสเพื่อป้องกันการฉีด SQL
แกรม

-1

เท่าที่ฉันเข้าใจมัน Truncate ไม่ใช่สิ่งที่คุณสามารถย้อนกลับได้ ดังนั้นการทำธุรกรรมเริ่มต้น / ธุรกรรมการทำสัญญาจึงไม่จำเป็น


สิ่งนี้ไม่เป็นความจริงและง่ายต่อการทดสอบโปรดลบ \ เปลี่ยนคำตอบนี้
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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.