আপনার সমস্যা সমাধানের জন্য, আমাদের সমস্যার জন্য একটি প্রোগ্রামিক পদ্ধতি গ্রহণ করতে হবে। আপনি এখানে যেতে পারেন দুটি রুট আছে। এই পদ্ধতির প্রয়োজন হওয়ার কারণ হ'ল কারণ আপনি কোনও নির্দিষ্ট বিবৃতিটির জন্য ট্রিগার অক্ষম করতে পারবেন না, এটি কেবলমাত্র টেবিলের সম্পূর্ণতার জন্য অক্ষম করা যেতে পারে।
বিকল্প 1: প্রসঙ্গ_Info ()
এমএস এসকিউএল টিপসে স্যামুয়েল ভঙ্গার দুর্দান্ত উদাহরণ ছিল:
USE AdventureWorks;
GO
-- creating the table in AdventureWorks database
IF OBJECT_ID('dbo.Table1') IS NOT NULL
DROP TABLE dbo.Table1
GO
CREATE TABLE dbo.Table1(ID INT)
GO
-- Creating a trigger
CREATE TRIGGER TR_Test ON dbo.Table1 FOR INSERT,UPDATE,DELETE
AS
DECLARE @Cinfo VARBINARY(128)
SELECT @Cinfo = Context_Info()
IF @Cinfo = 0x55555
RETURN
PRINT 'Trigger Executed'
-- Actual code goes here
-- For simplicity, I did not include any code
GO
এখন যখন স্যামুয়েল ট্রিগারটি কার্যকর করতে চায় না, তারা এটি ব্যবহার করে:
SET Context_Info 0x55555
INSERT dbo.Table1 VALUES(100)
Context_Info
বর্তমান অধিবেশন সম্পর্কিত তথ্য দখল করতে নিম্নলিখিত সিস্টেমের দর্শনগুলি ব্যবহার করে:
sys.dm_exec_requests
sys.dm_exec_sessions
sys.sysprocesses
এখানে মতাদর্শটি হ'ল আপনি যে বাইনারি স্ট্রিংটি স্থাপন করছেন তা কেবল বর্তমান সেশনেই উন্মুক্ত, সুতরাং যখন ট্রিগারটি আপনার অধিবেশন চলাকালীন কার্যকর হবে তখন এটি Context_info
ফাংশনের সুযোগ এবং পরিবর্তনশীল সেটিংটি দেখতে পাবে এবং এটি ট্রিগারটির পালানোর অংশে চলে যাবে jump পরিবর্তে.
বিকল্প 2: টেম্প টেবিল
Itzik বিন্-Gan থেকে একটি আছে দুর্দান্ত সমাধান তার পরে বইয়ে হয়: তার বই "টি-SQL প্রোগ্রামিং ইনসাইড মাইক্রোসফট SQL সার্ভার 2008 টি-SQL প্রোগ্রামিং" এ টি-এসকিউএল অনুসন্ধান । context_info
ফাংশনটি দিয়ে এটির প্রাথমিক সমস্যাটি হ'ল গৌণ টেম্পডিবি ওভারহেড।
অবাক করে দেওয়ার জন্য কিন্তু বইগুলির প্লটটি নষ্ট না করার জন্য (আমি মনে করেছি সেগুলি কেনা এবং পড়ার পক্ষে মূল্যবান), আপনি আপনার ট্রিগারটি পরিবর্তন করতে পারবেন।
আপনার ট্রিগারটিতে অস্থায়ী টেবিলের জন্য একটি পরীক্ষা করা উচিত। যদি অস্থায়ী টেবিলটি বিদ্যমান থাকে তবে ট্রিগারটির শেষ হওয়া উচিত এবং ক্রিয়াগুলি সম্পাদন করা উচিত নয়।
আপডেট বিবৃতিতে আপনি সম্পাদন করতে চান, অস্থায়ী টেবিলটি প্রথমে তৈরি করুন। এটি ট্রিগার হিসাবে একই লেনদেনে দেখা যাবে এবং এটি ট্রিগারটি আপনার বক্তব্যকে উপেক্ষা করবে।
ট্রিগার উদাহরণ:
CREATE TRIGGER TRIGGERNAME ON TABLENAME for INSERT AS
IF OBJECT_ID('tempdb..#FAKETEMPTABLE') IS NOT NULL RETURN;
GO
আপনি যখন ট্রিগারটি চালাতে চান না তখন সূচনা বিবরণের উদাহরণ:
CREATE TABLE #FAKETEMPTABLE(col1 SMALLINT);
আপনার উদাহরণের জন্য এটি পুরোপুরি রেখে দেওয়া:
ALTER TRIGGER tiu_benefit ON benefit FOR
...
AS
...
IF OBJECT_ID('tempdb..#FAKETEMPTABLE') IS NOT NULL RETURN;
--... rest of code here
GO
CREATE TABLE #FAKETEMPTABLE(col1 SMALLINT);
UPDATE benefit SET editor = 'srh' where benefit_id = 9876;
GO