2008-09-21 14 views
8

की तुलना कैसे करते हैं, मुझे एक सीएलओबी फ़ील्ड के मूल्य की तुलना करने की आवश्यकता है। कुछ की तरह: "="एसक्यूएल - डीबी 2 ट्रिगर में आप सीएलओबी

IF OLD_ROW.CLOB_FIELD != UPDATED_ROW.CLOB_FIELD 

लेकिन CLOBs की तुलना के लिए काम नहीं करता।

इसकी तुलना करने का तरीका क्या है? जोड़ने के लिए

संपादित:

मेरे ट्रिगर करता है, तो CLOB क्षेत्र एक अद्यतन के दौरान बदल गया था कुछ कार्रवाई करने की जरूरत है। यही कारण है कि मुझे ट्रिगर कोड में 2 सीएलओबी की तुलना करने की आवश्यकता है। मैं यह कैसे किया जा सकता है

+0

तो फिर तुम शायद विचार करना चाहिए @ igelkott का जवाब। यह सबसे अच्छा तरीका है। आप नए एमडी 5 चेकसम की गणना करते हैं और पुराने से इसकी तुलना करते हैं, और यदि वे भिन्न होते हैं, तो सीएलओबी बदल गया है। यह एक बहुत छोटा मौका है कि यह बदल गया और आपको एक ही चेकसम मिला - लेकिन इसके बारे में चिंता न करें। –

उत्तर

1

मेरा मानना ​​है कि यह क्योंकि वे जिस तरह से संग्रह किए गए हैं की, CLOB खेतों पर ऑपरेटरों की तरह उपयोग करने के लिए संभव नहीं है पर कुछ विस्तृत जानकारी के लिए देख रहा हूँ।

+0

यही कारण है कि मैं परेशान हूं। धन्यवाद। –

7

क्लॉब्स के md5 (या अन्य) हैश की गणना करें और फिर इनकी तुलना करें। आरंभिक गणना धीमी हो जाएगी लेकिन तुलना तेज और आसान है। यदि आपका डेटा बहुत अधिक नहीं बदलता है तो यह एक अच्छी विधि हो सकती है।

एमडी 5 की गणना करने का एक तरीका आपके ट्रिगर में जावा स्टेटमेंट के माध्यम से है। इन्हें एक ही तालिका में सहेजें (यदि संभव हो) या एक साधारण सहायक तालिका बनाएं।

तुलना-दर-हैश से सावधान रहें यदि आपके डेटा पर हमला करते हुए की संभावना है:

6

Iglekott का विचार एक अच्छा एक है, एक चेतावनी के साथ है। वर्तमान में यह एक विशिष्ट एमडी 5 मूल्य के लिए हैश टकराव उत्पन्न करने के लिए कम्प्यूटेशनल रूप से व्यवहार्य नहीं है, लेकिन दो अलग-अलग इनपुट उत्पन्न करना संभव है जो एक ही एमडी 5 (इसलिए आपके कोड को ट्रिगर नहीं करेंगे) उत्पन्न करेंगे। के साथ दो अलग-अलग तारों को उत्पन्न करना भी संभव है, वही उपसर्ग है जो उसी मान पर हैश है।

यदि इस तरह का हमला आपके सिस्टम की समझौता के साथ समझौता किया जा सकता है, और यह एक चिंता है, तो आप अन्य विकल्पों का पता लगाना चाहते हैं। सबसे आसान हैश फ़ंक्शन को स्विच करना आसान होगा, SHA-2 वर्तमान में कमजोरियों को ज्ञात नहीं करता है।

यदि यह कोई चिंता नहीं है - नरक, सीआरसी के साथ जाएं। आप यहाँ क्रिप्टोग्राफिक सुरक्षा के लिए नहीं जा रहे हैं। अगर यह सामान स्मार्टबॉम्ब पर स्थापित हो रहा है, तो बस क्रिप्टोग्राफिक रूप से कमजोर फ़ंक्शन के साथ न जाएं, 'mkay? :-)

8

ओरेकल 10 जी में आप DBMS_LOB.compare() API का उपयोग कर सकते हैं।

उदाहरण:

select * from table t where dbms_lob.compare(t.clob1, t.clob2) != 0 

पूर्ण एपीआई:

DBMS_LOB.COMPARE (
    lob_1   IN BLOB, 
    lob_2   IN BLOB, 
    amount   IN INTEGER := 4294967295, 
    offset_1   IN INTEGER := 1, 
    offset_2   IN INTEGER := 1) 
    RETURN INTEGER; 

DBMS_LOB.COMPARE (
    lob_1   IN CLOB CHARACTER SET ANY_CS, 
    lob_2   IN CLOB CHARACTER SET lob_1%CHARSET, 
    amount   IN INTEGER := 4294967295, 
    offset_1   IN INTEGER := 1, 
    offset_2   IN INTEGER := 1) 
    RETURN INTEGER; 

DBMS_LOB.COMPARE (
    lob_1   IN BFILE, 
    lob_2   IN BFILE, 
    amount   IN INTEGER, 
    offset_1   IN INTEGER := 1, 
    offset_2   IN INTEGER := 1) 
    RETURN INTEGER; 
+0

सावधान रहें कि "पैरामीटर के लिए पूर्ण या अमान्य इनपुट मानों के साथ कार्य एक पूर्ण लौटाते हैं"। कुछ मामलों में यह महत्वपूर्ण हो सकता है। – Vadzim

-1

नहीं बराबरी के लिए डीबी 2 उपयोग != करता है? एएनएसआई एसक्यूएल मानक बराबर के लिए <> का उपयोग करता है।

+0

डीबी 2 <> और! = दोनों के बदले में अनुमति देता है। इस सवाल के साथ समस्या ऑपरेटर के लिए इस्तेमाल नहीं किया गया था, लेकिन तथ्य यह है कि बड़े ऑब्जेक्ट डेटा प्रकार (बीएलओबी/सीएलओबी) अपने मूल प्रकार में समानता तुलना की अनुमति नहीं देते हैं। हालांकि, डीबी 2 एसक्यूएल एक्सप्रेशन को बीएलओबी या सीएलओबी के शीर्ष हिस्से को एक अलग डेटा प्रकार में डालने की अनुमति देता है, जिसमें तुलना संचालन की अनुमति देने वाले प्रकार शामिल हैं। –

1

यदि सीएलओबी 32K या उससे कम हैं, तो आप उन्हें VARCHAR के रूप में डाल सकते हैं, जो तुलना, पसंद, और विभिन्न SQL स्ट्रिंग फ़ंक्शंस की अनुमति देता है।

अन्यथा, आप सीएलओबी के हैश को रखने के लिए एक कॉलम जोड़ने पर विचार करना चाह सकते हैं और जब भी सीएलओबी अपडेट किया जाता है तो उस हैश को अद्यतित रखने के लिए एप्लिकेशन को बदलना पड़ सकता है।

2

एमडी 5 विचार शायद सबसे अच्छा है, लेकिन दूसरा विकल्प एक विशेष ट्रिगर बनाना है जो केवल आपके सीएलओबी फ़ील्ड को अपडेट होने पर ही आग लगती है।

syntax diagram के अनुसार, आप ट्रिगर के रूप में परिभाषित करते हैं:

CREATE TRIGGER trig_name AFTER UPDATE OF CLOB_FIELD 
//trigger body goes here 

यह मानते हुए है कि आपके आवेदन (या जो कोई भी तालिका अपडेट कर रहा है) बहुत चालाक CLOB क्षेत्र केवल जब किया गया है अद्यतन करने के लिए है क्लोब फ़ील्ड में किए गए बदलाव, और हर बार जब आपकी तालिका अपडेट नहीं होती है।

0

अगर उस विशेष कॉलम को अपडेट किया गया है तो बस ट्रिगर को आग लगाना घोषित करें।

create trigger T_TRIG on T 
before update of CLOB_COL 
... 
0

हैश मान उत्पन्न करना और उनकी तुलना करना IMHO का सबसे अच्छा तरीका है।

... 
declare leftClobHash integer; 
declare rightClobHash integer; 
set leftClobHash = (
    SELECT DBMS_UTILITY.GET_HASH_VALUE(OLD_ROW.CLOB_FIELD,100,1024) AS HASH_VALUE 
    FROM SYSIBM.SYSDUMMY1); 
set rightClobHash = (
    SELECT DBMS_UTILITY.GET_HASH_VALUE(UPDATED_ROW.CLOB_FIELD,100,1024) AS HASH_VALUE 
    FROM SYSIBM.SYSDUMMY1); 

IF leftClobHash != rightClobHash 
... 

ध्यान दें कि आप DBMS_UTILITY मॉड्यूल पर विशेषाधिकार निष्पादित की जरूरत है:

यहाँ अपरीक्षित कोड है। आप निम्न लिंक में प्रदान किए गए एसक्यूएल पीएल कोड के बारे में अधिक जानकारी प्राप्त कर सकते हैं।