2010-01-29 14 views
27

अगर वहाँ है:यदि अद्यतन() एसक्यूएल सर्वर ट्रिगर में

IF UPDATE (col1) 

... एसक्यूएल सर्वर ट्रिगर में एक मेज पर, यह सच वापसी करता है केवल तभी col1 बदल दिया गया है या अद्यतन किया गया?

मैं की तरह

UPDATE table-name 
    SET col1 = 'x', 
     col2 = 'y' 
WHERE id = 999 

अब क्या मेरी चिंता का विषय है, तो "col1" था 'एक्स' पहले तो फिर हम यह करने के लिए अद्यतन है एक नियमित रूप से अद्यतन क्वेरी है 'एक्स' होगा IF UPDATE ("col1") ट्रिगर वापसी सही है या नहीं ?

मुझे इस समस्या का सामना करना पड़ रहा है क्योंकि मेरी सहेजी गई क्वेरी सभी कॉलम के लिए सामान्य है, लेकिन जब मैं इस शर्त को जोड़ता हूं तो यह सच हो जाता है भले ही यह नहीं बदला गया हो ... इसलिए मुझे चिंता है कि इस मामले में क्या करना है यदि मैं चाहता हूं उस तरह की स्थिति जोड़ें?

उत्तर

39

यदि कॉलम अपडेट किया गया तो यह सच हो जाता है। एक अद्यतन का अर्थ है कि क्वेरी में कॉलम का मान सेट है। चाहे पिछला मान नया मान जैसा ही था, काफी हद तक अप्रासंगिक है।

UPDATE table SET col = col 

यह एक अद्यतन है।

UPDATE table SET col = 99 

जब कॉल पहले से ही 99 था, तो यह भी एक अपडेट है।

+11

पर ध्यान दें कि एक INSERT पर, UPDATED() फ़ंक्शन सभी कॉलम के लिए 1 लौटाता है। बेशक। – ErikE

+1

और एक डेले पर? – Rory

+4

अद्यतन करता है अद्यतन() फ़ंक्शन DELETEs के लिए सत्य नहीं लौटाता है। http://stackoverflow.com/questions/29286034 – Rory

10

ट्रिगर के भीतर, आपके पास दो आंतरिक तालिकाओं तक पहुंच है जो सहायता कर सकती हैं। 'सम्मिलित' तालिका में प्रत्येक प्रभावित पंक्ति का नया संस्करण शामिल है, 'हटाई गई' तालिका में प्रत्येक पंक्ति का मूल संस्करण शामिल है। यह देखने के लिए कि क्या आपका फ़ील्ड मान वास्तव में बदला गया था, आप इन तालिकाओं में मानों की तुलना कर सकते हैं।

+0

असल में, मैं यह जांच चाहता था ताकि –

+0

कोई अपडेट न हो तो निष्पादन आगे नहीं बढ़ता है - यदि आप फ़ील्ड बदल गए हैं तो मूल और नए मानों की तुलना करने के लिए आप डाले गए और हटाए गए तालिकाओं के साथ एक कथन का उपयोग करें - , अपनी बात करें - यदि नहीं, – Ray

2

आप जो भी करते हैं, अपडेट किए गए() (नल के लिए खाता न भूलें) के बजाय डाले गए और हटाए गए तालिकाओं में अलग-अलग मानों की जांच करें। या आप अनियंत्रित अपडेट करना बंद कर सकते हैं।

1

"कोई वास्तविक अद्यतन" मामले शॉर्टकट के लिए, आप भी जरूरत है शुरुआत में यह देखना होगा कि आपकी क्वेरी किसी भी पंक्तियों में सभी प्रभावित:

set nocount on; -- this must be the first statement! 
if not exists (select 1 from inserted) and not exists (select 1 from deleted) 
    return; 
2

यहाँ पंक्तियों को स्कैन करने के लिए एक त्वरित तरीका है किसी भी स्तंभ देखने के लिए ट्रिगर की सामग्री को चलाने का निर्णय लेने से पहले बदल दिया। यह उदाहरण के लिए उपयोगी हो सकता है जब आप इतिहास रिकॉर्ड लिखना चाहते हैं, लेकिन यदि आप वास्तव में कुछ भी नहीं बदलते हैं तो आप इसे नहीं करना चाहते हैं।

हम ईटीएल आयात प्रक्रियाओं में हर समय इसका उपयोग करते हैं जहां हम डेटा फिर से आयात कर सकते हैं लेकिन अगर स्रोत फ़ाइल में वास्तव में कुछ भी नहीं बदला है तो हम एक नया इतिहास रिकॉर्ड नहीं बनाना चाहते हैं।

CREATE TRIGGER [dbo].[TR_my_table_create_history] 
ON [dbo].[my_table] FOR UPDATE AS 

BEGIN 

    -- 
    -- Insert the old data row if any column data changed 
    -- 
    INSERT INTO [my_table_history] 
    SELECT d.* 
    FROM deleted d 
    INNER JOIN inserted i ON i.[id] = d.[id] 
    -- 
    -- Use INTERSECT to see if anything REALLY changed 
    -- 
    WHERE NOT EXISTS(SELECT i.* INTERSECT SELECT d.*) 

END 

ध्यान दें कि यह विशेष रूप से ट्रिगर हो जाती है अपने स्रोत तालिका (एक ट्रिगर ट्रिगर) और इतिहास तालिका समान स्तंभ लेआउट है।

0
SET NOCOUNT ON; 

    declare @countTemp int 
    select @countTemp = Count (*) from (
    select City,PostCode,Street,CountryId,Address1 from Deleted 
    union 
    select City,PostCode,Street,CountryId,Address1 from Inserted 
    ) tempTable 

    IF (@countTemp > 1) 

Begin 

-- Your Code goes Here 
End 

-- if any of these "City,PostCode,Street,CountryId,Address1" got updated then trigger 

-- will work in " IF (@countTemp > 1) " Code) 
0
cREATE TRIGGER boo ON status2 FOR UPDATE AS 
IF UPDATE (id) 
BEGIN 
SELECT 'DETECT'; 
END; 

UPDATE status2 SET name = 'K' WHERE name= 'T' --no action 
UPDATE status2 SET name = 'T' ,id= 8 WHERE name= 'K' --detect 
0

यह मैं

DECLARE @LongDescDirty bit = 0 

Declare @old varchar(4000) = (SELECT LongDescription from deleted) 
Declare @new varchar(4000) = (SELECT LongDescription from inserted) 

if (@old <> @new) 
    BEGIN 
     SET @LongDescDirty = 1 
    END 

Update table 
    Set LongDescUpdated = @LongDescUpdated 

के लिए काम किया .....

+2

यह सुरक्षित नहीं है क्योंकि सम्मिलित और हटाए गए एक से अधिक रिकॉर्ड हो सकते हैं यदि अद्यतन विवरण कई रिकॉर्ड पर लागू किया गया था। – PapillonUK

संबंधित मुद्दे