किसी तालिका को रौंदने के लिए कौन-सी अनुमतियां आवश्यक हैं?


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डीडीएल है, डीएमएल नहीं।
RBarryYoung

जवाबों:


26

इस जानकारी को देखने के लिए सबसे अच्छी जगह ऑनलाइन पुस्तकों में है। TRUNCATE TABLE यहाँ पर लेख इंगित करता है:

आवश्यक न्यूनतम अनुमति table_name पर ALTER है। TRUNCATE टेबल अनुमतियाँ डिफ़ॉल्ट रूप से तालिका के स्वामी, sysadmin के सर्वर तय सर्वर भूमिका और db_owner और db_ddladmin तय डेटाबेस भूमिकाओं के सदस्य हैं, और हस्तांतरणीय नहीं हैं। हालाँकि, आप एक मॉड्यूल के भीतर TRUNCATE टेबल विवरण को शामिल कर सकते हैं, जैसे कि एक संग्रहीत प्रक्रिया, और EXECUTE AS क्लॉज का उपयोग करके मॉड्यूल को उचित अनुमति प्रदान करें।

तो यह आवश्यक न्यूनतम अनुमतियाँ है। आप इसे DB स्वामी के रूप में प्राप्त कर सकते हैं, आप DB_DDLAdmin के रूप में प्राप्त कर सकते हैं। या सिर्फ अनुदान परिवर्तन।

यदि आप सोचते हैं कि ट्रंकट क्या करता है और यह कैसे काम करता है, तो यह समझ में आता है, यह एक बहुत ही "गंभीर" कमांड है और डेटा की तालिका को खाली करता है और इसे जल्दी करता है।


12

BOL में इस संदर्भ के अनुसार :

आवश्यक न्यूनतम अनुमति table_name पर ALTER है । TRUNCATE टेबल अनुमतियाँ डिफ़ॉल्ट रूप से तालिका के स्वामी , sysadmin के सदस्यों को निश्चित सर्वर भूमिका, और db_owner और db_ddladmin तय डेटाबेस भूमिकाओं के लिए, और हस्तांतरणीय नहीं हैं। हालाँकि, आप एक मॉड्यूल के भीतर TRUNCATE टेबल विवरण को शामिल कर सकते हैं, जैसे कि एक संग्रहीत प्रक्रिया, और 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;

यह एक अच्छा विचार है, लेकिन इसे बेहतर बनाया जा सकता है। उदाहरण के लिए, try..catch को जोड़ते हुए, एक और चीज़ बाधाओं की जाँच कर रही है, विशेष रूप से विदेशी कुंजी, पहचान क्षेत्रों को भी, उन्हें फिर से शुरू करने की आवश्यकता है। आप अपनी प्रक्रिया में वह सब कर सकते हैं। यदि आप ऐसा करते हैं, तो नया कोड साझा करें। ;)
मार्सेल्लो मिओरेल्ली

1

आप केवल एक तालिका या किसी भी तालिका में संग्रहीत कार्यविधि के स्वामी के रूप में निष्पादित प्रक्रिया बना सकते हैं। अगले कोड में db_owner या अन्य की अनुमति के बिना किसी भी तालिका को छोटा करने के लिए प्रक्रिया संग्रहीत है। एसपी के इस संस्करण में 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
यह दूसरे उत्तर में कोड के समान दिखता है। क्या आप एक ही उपयोगकर्ता हैं?
ypercube y

@ ypercube y - वह SQL इंजेक्शन से बचाने के लिए कोड जोड़कर पूर्ववर्ती उत्तर पर विस्तार कर रहा है।
ग्रीम

-1

जहां तक ​​मैं समझता हूं कि यह Truncate ऐसी चीज नहीं है जिसे आप रोलबैक कर सकते हैं। इसलिए शुरुआती लेनदेन / प्रतिबद्ध लेनदेन अनावश्यक है।


यह सच नहीं है और इस जवाब को हटाना \
_

BEGIN TRANSACTION RADHE SELECT @@TRANCOUNT select * from [dbo].[mytable] truncate table [dbo].[mytable] rollback select * from [dbo].[mytable] /*COMMIT TRAN RADHE*/ SELECT @@TRANCOUNT
मार्सेलो मिओरेल्ली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.