मुझे नहीं लगता कि आप ट्रिगर्स को समझते हैं - ट्रिगर फायरिंग उस स्टेटमेंट से जुड़ी होती है, जिससे वे संबंधित होते हैं, बजाय इसके कि लेन-देन कब होता है। दो स्क्रिप्ट:
स्क्रिप्ट 1:
create table T1 (
ID int not null,
Val1 varchar(10) not null
)
go
create table T2 (
ID int not null,
Val2 varchar(10) not null
)
go
create trigger T_T1_I
on T1
after insert
as
insert into T2 (ID,Val2) select ID,Val1 from inserted
go
begin transaction
insert into T1 (ID,Val1)
select 10,'abc'
go
RAISERROR('Run script 2 now',10,1) WITH NOWAIT
WAITFOR DELAY '00:01:00'
go
commit
स्क्रिप्ट 2:
select * from T2 with (nolock)
एक ही डीबी में दो कनेक्शन खोलें, प्रत्येक कनेक्शन में एक स्क्रिप्ट डालें। स्क्रिप्ट चलाएँ 1. जब यह "अभी स्क्रिप्ट 2 चलाएँ" संदेश प्रदर्शित करता है, तो दूसरे कनेक्शन पर स्विच करें। आप देखेंगे कि आप T2 से अप्रतिबद्ध डेटा का चयन करने में सक्षम हैं, भले ही वह डेटा ट्रिगर द्वारा डाला गया हो। (इसका यह भी अर्थ है कि ट्रिगर के आने तक T2 पर स्क्रिप्ट 1 द्वारा उपयुक्त ताले रखे जा रहे हैं)।
चूंकि इसका मतलब है कि आप जो मांग रहे हैं उसके बराबर है बस बेस टेबल में डालना और अपने लेन-देन को खुला रखना, आप ऐसा कर सकते हैं।
यदि आप उपयोगकर्ताओं से तालिका के वास्तविक आकार को छिपाना चाहते हैं, तो एक दृश्य बनाएं और बेस टेबल को अपडेट करने के लिए उस पर ट्रिगर्स लिखें। जैसा कि ऊपर बताया गया है, जैसे ही आपने दृश्य के विरुद्ध एक डीएमएल ऑपरेशन किया है, ट्रिगर्स सक्रिय हो गए होंगे, और आप बेस टेबल के खिलाफ ताले रखेंगे। अन्य कनेक्शनों के लेन-देन अलगाव स्तर के आधार पर, वे आपके परिवर्तन देख सकते हैं, या लेन-देन होने तक अवरुद्ध हो सकते हैं।