মুছে ফেলার ট্রিগারটিতে এমন কী তথ্য পাঠানোর কোনও উপায় আছে যাতে এটি জানতে পারে যে রেকর্ডটি মোছা হয়েছে?
হ্যাঁ: বলা হয় খুব শীতল (এবং ব্যবহৃত বৈশিষ্ট্যের অধীনে) ব্যবহার করে CONTEXT_INFO
। এটি মূলত সেশন মেমরি যা সমস্ত স্কোপে বিদ্যমান এবং লেনদেন দ্বারা আবদ্ধ নয়। এটি তথ্য (যে কোনও তথ্য - ভাল, যে কোনও সীমাবদ্ধ স্থানের সাথে ফিট করে) পাশাপাশি ট্রি-ট্র্যাকগুলিতে সাব-প্রোক / এক্সইসি কলগুলির মধ্যে পিছনে পিছনে ব্যবহৃত হতে পারে। এবং আমি এই একই একই পরিস্থিতির জন্য আগে ব্যবহার করেছি।
এটি কীভাবে কাজ করে তা দেখতে নীচের সাথে পরীক্ষা করুন। লক্ষ্য করুন যে আমি এর CHAR(128)
আগে রূপান্তর করছি CONVERT(VARBINARY(128), ..
। এটি খালি প্যাডিংকে বাধ্যতামূলক করা VARCHAR
যখন এটি এস CONTEXT_INFO()
থেকে VARBINARY(128)
ডান-প্যাডযুক্ত হওয়ার পরে এটি থেকে বেরিয়ে আসার সময় সহজেই রূপান্তর করা সহজ 0x00
।
SELECT CONTEXT_INFO();
-- Initially = NULL
DECLARE @EncodedUser VARBINARY(128);
SET @EncodedUser = CONVERT(VARBINARY(128),
CONVERT(CHAR(128), 'I deleted ALL your records! HA HA!')
);
SET CONTEXT_INFO @EncodedUser;
SELECT CONTEXT_INFO() AS [RawContextInfo],
RTRIM(CONVERT(VARCHAR(128), CONTEXT_INFO())) AS [DecodedUser];
ফলাফল:
0x492064656C6574656420414C4C20796F7572207265636F7264732120484120484121202020202020...
I deleted ALL your records! HA HA!
সবগুলোকে একত্রে রাখ:
অ্যাপ্লিকেশনটিকে এমন একটি "মুছুন" সঞ্চিত পদ্ধতি কল করতে হবে যা রেকর্ডটিকে মুছে ফেলছে এমন ব্যবহারকারীর নাম (বা যা কিছু) পাস করে। আমি ধরে নিলাম এটি ইতিমধ্যে মডেলটি ব্যবহৃত হচ্ছে কারণ এটির মতো শোনা যাচ্ছে যে আপনি ইতিমধ্যে সন্নিবেশ এবং আপডেট ক্রিয়াকলাপগুলি ট্র্যাক করছেন।
"মুছুন" সঞ্চিত পদ্ধতিটি করে:
DECLARE @EncodedUser VARBINARY(128);
SET @EncodedUser = CONVERT(VARBINARY(128),
CONVERT(CHAR(128), @UserName)
);
SET CONTEXT_INFO @EncodedUser;
-- DELETE STUFF HERE
নিরীক্ষার ট্রিগারটি করে:
-- Set the INT value in LEFT (currently 50) to the max size of [UserWhoMadeChanges]
INSERT INTO AuditTable (IdOfRecordedAffected, UserWhoMadeChanges)
SELECT del.ID, COALESCE(
LEFT(RTRIM(CONVERT(VARCHAR(128), CONTEXT_INFO())), 50),
'<unknown>')
FROM DELETED del;
দয়া করে নোট করুন যে, @ সানগ্যালার্ডি একটি মন্তব্যে উল্লেখ করেছেন, অন্যান্য পদ্ধতি এবং / অথবা এই টেবিল থেকে রেকর্ডগুলি মোছার জন্য এইড-এইচ কোয়ের কারণে, সম্ভবত এটি হয়:
CONTEXT_INFO
সেট করা হয়নি এবং এখনও আছে NULL
:
এই কারণে মানটি ডিফল্ট INSERT INTO AuditTable
করতে আমি ব্যবহার COALESCE
করতে উপরেরটি আপডেট করেছি । অথবা, যদি আপনি ডিফল্ট না চান এবং একটি নাম প্রয়োজন হয় তবে আপনি এর মতো কিছু করতে পারেন:
DECLARE @UserName VARCHAR(50); -- set to the size of AuditTable.[UserWhoMadeChanges]
SET @UserName = LEFT(RTRIM(CONVERT(VARCHAR(128), CONTEXT_INFO())), 50);
IF (@UserName IS NULL)
BEGIN
ROLLBACK TRAN; -- cancel the DELETE operation
RAISERROR('Please set UserName via "SET CONTEXT_INFO.." and try again.', 16 ,1);
END;
-- use @UserName in the INSERT...SELECT
CONTEXT_INFO
যে একটি মান সেট করা হয়েছে না একটি বৈধ ব্যবহারকারী নাম, তাই মাপ অতিক্রম পারে AuditTable.[UserWhoMadeChanges]
ক্ষেত্র:
এই কারণে আমি একটি LEFT
ফাংশন যুক্ত করেছি তা নিশ্চিত করার জন্য যা যা ধরা পড়েছে CONTEXT_INFO
তা ভেঙে না যায় INSERT
। কোডটিতে উল্লিখিত হিসাবে, আপনাকে কেবল ক্ষেত্রের 50
আসল আকারে সেট করতে হবে UserWhoMadeChanges
।
এসকিউএল সার্ভারের জন্য আপডেট ২০১ 2016 এবং আরও নতুন
এসকিউএল সার্ভার 2016 এই প্রতি সেশনের মেমরির একটি উন্নত সংস্করণ যুক্ত করেছে: সেশন প্রসঙ্গ। নতুন সেশন প্রসঙ্গটি মূলত "কী" টাইপ sysname
(যেমন NVARCHAR(128)
) এবং "মান" সত্তার সাথে কী-মান জোড়াগুলির একটি হ্যাশ টেবিল SQL_VARIANT
। অর্থ:
- মানগুলির একটি বিচ্ছেদ এখন অন্যান্য ব্যবহারের সাথে বিরোধের সম্ভাবনা কম
- আপনি বিভিন্ন ধরণের সঞ্চয় করতে পারেন, এর মাধ্যমে মূল্যটি ফেরত পাওয়ার সময় অদ্ভুত আচরণ সম্পর্কে আর চিন্তা করার দরকার নেই (বিশদর
CONTEXT_INFO()
জন্য, দয়া করে আমার পোস্টটি দেখুন: কেন কনটেক্সT_INFO () সেট কনটেক্সT_INFO দ্বারা সুনির্দিষ্ট মানটি ফেরত দেয় না? )
- আপনি আরও অনেক বেশি স্থান পাবেন: "মান" প্রতি 8000 বাইট সর্বাধিক, সমস্ত কীগুলিতে 256kb অবধি (128 বাইট সর্বাধিকের তুলনায়
CONTEXT_INFO
)
বিশদ জন্য, নিম্নলিখিত ডকুমেন্টেশন পৃষ্ঠা দেখুন:
SUSER_SNAME()
কে হ'ল রেকর্ডটি মুছে ফেলার চাবি।