কোনও টেবিল কেটে দেওয়ার জন্য কী অনুমতিগুলি প্রয়োজন?


14

আমার একটি ডাটাবেসে নিম্নলিখিত অনুমতি সহ একটি এসকিউএল অ্যাকাউন্ট রয়েছে:

এখানে চিত্র বর্ণনা লিখুন

db_executorআপনি এই অ্যাকাউন্টটির সদস্য হিসাবে যে ভূমিকাটি দেখছেন তা এই স্ক্রিপ্ট দ্বারা তৈরি হয়েছিল:

CREATE ROLE [db_executor] AUTHORIZATION [dbo]
GO

GRANT EXECUTE TO [db_executor] 
GO

আমি যখন কোনো চালানো select, update, insertবা deleteটেবিলের উপর, এটা কাজ করে জরিমানা। আমি যখন truncateটেবিলটিতে চেষ্টা করি তখন এটি আমাকে এই ত্রুটি বার্তা দেয়:

"টেবিলনাম" অবজেক্টটি খুঁজে পাওয়া যায়নি কারণ এটি বিদ্যমান নেই বা আপনার অনুমতি নেই।

এই অ্যাকাউন্টটি কি অনুমতি অনুপস্থিত?


TRUNCATE TABLEডিডিএল, ডিএমএল নয়।
আরবেরি ইয়ং

উত্তর:


26

এই তথ্যের সন্ধানের সর্বোত্তম জায়গা হ'ল অনলাইনে বই। নিবন্ধ TRUNCATE TABLE এখানে ইঙ্গিত:

সর্বনিম্ন অনুমতি প্রয়োজন টেবিল-নাম এ ALTER হয়। টেবিল মালিক, সিসাদমিন স্থির সার্ভার রোলের সদস্যগণ এবং db_owner এবং db_ddladmin স্থির ডাটাবেসের ভূমিকা ডিফল্ট অনুমোদনের ট্র্যাঙ্কেট টেবল অনুমতিগুলি স্থানান্তরযোগ্য নয়। যাইহোক, আপনি ট্র্যাবলেট টেবিল বিবৃতিটি একটি মডিউলে যেমন একটি সঞ্চিত প্রক্রিয়া হিসাবে অন্তর্ভুক্ত করতে পারেন এবং এক্সিকিউটি এএস ক্লজটি ব্যবহার করে মডিউলটিকে উপযুক্ত অনুমতি প্রদান করতে পারেন।

সুতরাং ALTER হ'ল ন্যূনতম অনুমতি প্রয়োজন। আপনি এটি ডিবি মালিক হিসাবে পেতে পারেন, আপনি এটি ডিবি_ডিডিএলডমিন হিসাবে পেতে পারেন। বা শুধু পরিবর্তন মঞ্জুর করুন।

আপনি যদি কাটা কাটা কি করে এবং এটি কীভাবে কাজ করে সে সম্পর্কে চিন্তা করে, এটি অর্থবোধ করে তোলে, এটি একটি দুর্দান্ত "গুরুতর" কমান্ড এবং ডেটা সারণীটি খালি করে এবং তা দ্রুত করে তোলে।


12

অনুযায়ী BOL মধ্যে এই রেফারেন্স :

ন্যূনতম অনুমতি নেই TABLE_NAME alter চালু । থেকে truncate টেবিল অনুমতি ডিফল্ট টেবিল মালিক , সদস্যদের sysadmin সংশোধন সার্ভার ভূমিকা, এবং db_owner এবং db_ddladmin সংশোধন ডাটাবেসের ভূমিকা এবং হস্তান্তরযোগ্য নয়। যাইহোক, আপনি ট্র্যাবলেট টেবিল বিবৃতিটি একটি মডিউলে যেমন একটি সঞ্চিত প্রক্রিয়া হিসাবে অন্তর্ভুক্ত করতে পারেন এবং এক্সিকিউটি 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 যুক্ত করে, অন্য একটি জিনিস সীমাবদ্ধতাগুলি, বিশেষত বিদেশী কীগুলি, এছাড়াও সনাক্তকরণের ক্ষেত্রগুলির জন্য তাদের পরীক্ষা করা দরকার them আপনার পদ্ধতিতে আপনার এটি সমস্ত থাকতে পারে। আপনি যদি এটি করেন তবে নতুন কোডটি ভাগ করুন। ;)
মার্সেলো মিয়োরেলি

1

আপনি কেবল কোনও টেবিলের মালিক হিসাবে কার্যকর করতে বা কোনও টেবিলে একটি সঞ্চিত পদ্ধতিতে স্টোরেজ পদ্ধতি তৈরি করতে পারেন। পরবর্তী কোডে db_owner বা অন্যের অনুমতি না দিয়ে কোনও টেবিল কেটে কাটা প্রক্রিয়া সংরক্ষণ করা হয়। এসপি-র এই সংস্করণে এসকিউএল ইঞ্জেকশনের ত্রুটিগুলি পরিচালনা ও প্রতিরোধকে অন্তর্ভুক্ত করা হয়েছে

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ᵀᴹ

@ ইয়পারক्यूबᵀᴹ - এসকিউএল ইঞ্জেকশন থেকে রক্ষা করার জন্য কোড যুক্ত করে তিনি পূর্ববর্তী উত্তরটি প্রসারিত করছেন।
গ্রামীণ

-1

আমি যতদূর বুঝতে পেরেছি কাটা কাটা এমন কিছু নয় যা আপনি রোলব্যাক করতে পারেন। সুতরাং বিজনেস / কমিট লেনদেন অপ্রয়োজনীয়।


এটি সত্য নয় এবং এটি পরীক্ষা করা সহজ please এই উত্তরটি পরিবর্তন করুন
মার্সেলো মিয়োরেলি

BEGIN TRANSACTION RADHE SELECT @@TRANCOUNT select * from [dbo].[mytable] truncate table [dbo].[mytable] rollback select * from [dbo].[mytable] /*COMMIT TRAN RADHE*/ SELECT @@TRANCOUNT
মার্সেলো মিয়োরেলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.