কেন স্কেলার মূল্যবান ফাংশনগুলিকে বাছাই না করে সম্পাদনের অনুমতি প্রয়োজন?


15

আমি ভাবছি কেন, স্কেলারের মূল্যবান ফাংশনটির জন্য, আমাকে কেবল একটি নির্বাচনের পরিবর্তে ব্যবহারকারীর মৃত্যুদণ্ড দিতে হবে?

ইতিমধ্যে একটি টেবিলের মূল্যবান ফাংশন কেবলমাত্র নির্বাচিত অনুমতি বা db_datareaderসদস্যতার সাথে সূক্ষ্মভাবে কাজ করে ।

এখানে আরও পরিষ্কার হওয়ার জন্য আমার উদাহরণটি: আমার এমন একটি ব্যবহারকারী দরকার যা কেবলমাত্র ডেটাবেসটিতে অনুমতি পড়তে পারেন। তাই আমি একটি ব্যবহারকারী তৈরি করেছি testUserএবং এটিতে db_datareaderসদস্যতা দেব । তারপর আমি একটা টেবিল মূল্যবান ফাংশন বলা নির্মিত fn_InlineTable। এবং সব দুর্দান্ত। testUserসারা দিন এই এসকিউএল চালায়

select * from dbo.fn_InlineTable

তারপরে আমার একটি স্কেলার ফাংশন প্রয়োজন, তাই আমি একটি স্কেলার ফাংশন তৈরি করেছি fn_ScalarTesttestUserএই এসকিউএল চালাতে পারে না

Select dbo.fn_ScalarTest(1) 

ভালভাবে বোধগম্য: এটি কারণ যে আমি "testUser" চালানোর অনুমতি দিই নি fn_ScalarTest

আমার প্রশ্নটি হল: এই লিঙ্কটির উপর ভিত্তি করে /programming/6150888/insert-update-delete-with-function-in-sql-server , যে বলে যে একটি FUNCTIONএমন ক্রিয়া সম্পাদন করতে ব্যবহার করা যাবে না যা ডাটাবেস স্থিতি পরিবর্তন করে । তাহলে কেন কোনও স্কেলার ফাংশনটিকে অনুমতি কার্যকর করার পরিবর্তে একই "নির্বাচন" অনুমতিতে ব্যবহার করা দেওয়া হবে না ??

আমি আশা করি আমার প্রশ্নটি বোধগম্য হবে। ধন্যবাদ.

উত্তর:


15

সম্ভবত সম্ভবত প্রাথমিক কারণটি হ'ল টেবিল-মূল্যবান ফাংশনগুলি সারণী এবং দর্শনগুলির মতো ফলাফল সেটটি ফেরত দেয়। এর অর্থ এই যে তারা ব্যবহার করা যেতে পারে FROMদফা (তত্সহ JOINs এবং APPLYএর গুলি, ইত্যাদি) SELECT, UPDATEএবং DELETEপ্রশ্নের। আপনি তবে এই প্রসঙ্গে যে কোনও একটিতে স্কেলার ইউডিএফ ব্যবহার করতে পারবেন না।

দ্বিতীয়ত, আপনি EXECUTEএকটি স্কেলার ইউডিএফও করতে পারেন । আপনি যখন ইনপুট পরামিতিগুলির জন্য নির্দিষ্ট মান নির্ধারণ করেন তখন এই বাক্য গঠনটি বেশ কার্যকর। নিম্নলিখিত ইউডিএফ নিন, উদাহরণস্বরূপ:

CREATE FUNCTION dbo.OptionalParameterTest (@Param1 INT = 1, @Param2 INT = 2)
RETURNS INT
AS
BEGIN
    RETURN @Param1 + @Param2;
END;

আপনি যদি কোনও ইনপুট প্যারামিটারগুলিকে "alচ্ছিক" হিসাবে বিবেচনা করতে চান DEFAULTতবে স্বাক্ষরটি স্থির হওয়ার পরে আপনার কীওয়ার্ডটি কোনও ফাংশনের মতো ডাকার সময় পাস করতে হবে :

DECLARE @Bob1 INT;

SET @Bob1 = dbo.OptionalParameterTest(100, DEFAULT);

SELECT @Bob1;
-- Returns: 102

অন্যদিকে, আপনি যদি EXECUTEফাংশন করেন তবে আপনি কোনও সঞ্চিত পদ্ধতি ব্যবহারের মতো ডিফল্ট মান সহ যে কোনও প্যারামিটারকে সত্যই optionচ্ছিক হিসাবে বিবেচনা করতে পারবেন। প্যারামিটারের নাম উল্লেখ না করে আপনি প্রথম এন প্যারামিটারগুলিতে পাস করতে পারেন :

DECLARE @Bob2 INT;

EXEC @Bob2 = dbo.OptionalParameterTest 50;

SELECT @Bob2;
-- Returns: 52

এমনকি আপনি সঞ্চিত প্রক্রিয়াগুলির মতো প্যারামিটারের নামগুলি উল্লেখ করে প্রথম প্যারামিটারটি এড়িয়ে যেতে পারেন:

DECLARE @Bob3 INT;

EXEC @Bob3 = dbo.OptionalParameterTest @Param2 = 50;

SELECT @Bob3;
-- Returns: 51

হালনাগাদ

আপনি কেন EXECএকটি স্টোরড পদ্ধতির মতো একটি স্কেলার ইউডিএফ কল করতে সিনট্যাক্সটি ব্যবহার করতে চাইতে পারেন ? মাঝেমধ্যে ইউডিএফ রয়েছে যা ইউডিএফ হিসাবে থাকতে পারে যেহেতু এগুলিকে কোনও ক্যোয়ারিতে যুক্ত করা যায় এবং ফিরে আসা সারিগুলির সেট পরিচালনা করতে পারে, অন্যদিকে যদি কোডটি একটি সঞ্চিত পদ্ধতিতে থাকে তবে এটির জন্য কার্সারে রাখার প্রয়োজন হবে সারিগুলির একটি সেট জুড়ে পুনরাবৃত্তি করুন। তবে তারপরে এমন সময় আছে যে আপনি সেই ফাংশনটিকে একটি মানতে কল করতে চান, সম্ভবত অন্য কোনও ইউডিএফের মধ্যে থেকে। একটি একক মানের জন্য একটি ইউডিএফ কল করা হিসাবে করা যেতে পারে:

SELECT dbo.UDF('some value');

সেক্ষেত্রে আপনি একটি ফলাফল সেটে একটি রিটার্ন মান পান (ফলাফল সেটটি কাজ করবে না)। অথবা এটি নিম্নলিখিত হিসাবে করা যেতে পারে:

DECLARE @Dummy INT;

SET @Dummy = dbo.UDF('some value');

এই ক্ষেত্রে আপনাকে @Dummyভেরিয়েবল ঘোষণা করতে হবে ;

যাইহোক, EXECসিনট্যাক্স সহ, আপনি both উভয় বিরক্তি এড়াতে পারেন:

EXEC dbo.UDF 'some value';

ALSO, স্কেলার ইউডিএফগুলির মৃত্যুদণ্ড কার্যকর করার পরিকল্পনাগুলি ক্যাশেড রয়েছে। এর অর্থ হ'ল ইউডিএফ-এ কার্যকর করার পরিকল্পনা রয়েছে এমন প্রশ্নগুলি থাকলে প্যারামিটার স্নিফিংয়ের সমস্যাগুলিতে চালানো সম্ভব। EXECসিন্টেক্সগুলি যেখানে সিনট্যাক্সটি ব্যবহার করা সম্ভব হবে, তারপরে সেই নির্বাহের জন্যWITH RECOMPILE সংকলিত পরিকল্পনাগুলি উপেক্ষা করার বিকল্পটিও ব্যবহার করা সম্ভব । উদাহরণ স্বরূপ:

সেটআপ:

GO
CREATE FUNCTION dbo.TestUDF (@Something INT)
RETURNS INT
AS 
BEGIN
   DECLARE @Ret INT;
   SELECT @Ret = COUNT(*)
   FROM   sys.indexes si
   WHERE  si.[index_id] = @Something;

   RETURN @Ret;
END;
GO

পরীক্ষা:

DECLARE @Val INT;

SET @Val = dbo.TestUDF(1);
SELECT @Val;

EXEC @Val = dbo.TestUDF 0 -- uses compiled value of (1)
SELECT @Val;

EXEC @Val = dbo.TestUDF 0 WITH RECOMPILE; -- uses compiled value of (0)
SELECT @Val;

EXEC @Val = dbo.TestUDF 3 -- uses compiled value of (1)
SELECT @Val;

4

আমার মনে হয় অনুমতিগুলির মধ্যে পার্থক্য হ'ল আপনি প্রকৃতপক্ষে সঞ্চিত পদ্ধতির মতো EXEC এর সাথে স্কেলার-মূল্যবান ব্যবহারকারী-সংজ্ঞায়িত ক্রিয়াকলাপগুলি আহ্বান করতে পারেন (যা আমি এসকিউএল সার্ভার 2000 বই অনলাইন অনুসন্ধানের আগে উপলব্ধি করতে পারি নি, যেখানে তারা ব্যবহারকারী-সংজ্ঞায়িত ফাংশনগুলি প্রবর্তন করেছিল) , তবুও আপনি আসলে তাদের থেকে কোনও টেবিল উত্স হিসাবে নির্বাচন করতে পারবেন না। উদাহরণ স্বরূপ:

DECLARE @date datetime
EXEC @date = dbo.first_day_of_month '8/14/2015'
SELECT @date

এই ক্ষেত্রে, dbo.first_day_of_month একটি ব্যবহারকারী-সংজ্ঞায়িত ফাংশন। আমি জানি না আপনি কেন কখনও কোনও ফাংশনটি সেভাবে ডাকবেন তবে আমি অনুমান করব যে ধারাবাহিকতা বজায় রাখতে তাদের বেছে নেওয়ার পরিবর্তে তাদের এক্সিকিউট অনুমতি প্রয়োজন permission আজকাল সম্ভবত এটি সামঞ্জস্যের ব্যাগেজ হিসাবে ধরে আছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.