2013-03-20 8 views
7

मेरे पास एक बड़े डेटाबेस के साथ उत्पादन में एक हाइबरनेट-आधारित ऐप है। मुझे इस एप्लिकेशन में दो इकाइयों (दो टेबल) में ऑडिटिंग जोड़ने की ज़रूरत है, और मैंने Envers के साथ जाने का फैसला किया है।किसी मौजूदा डेटाबेस में कनवर्ट करना

प्रत्येक INSERT, अद्यतन या हटाए जाने के लिए, Envers इकाई की ऑडिट तालिका में एक नया रिकॉर्ड जोड़ता है।

यदि मैंने एप्लिकेशन की शुरुआत से समर्थन प्राप्त किया था, तो लेखापरीक्षा तालिकाएं संस्थाओं के निर्माण (आईएनएसईआरटी) के समय आबादी में आ जाएंगी।

एन्हॉर्ड्स दस्तावेज बहुत पतला है, और किसी मौजूदा एप्लिकेशन में एनवर जोड़ने के बारे में कुछ भी नहीं बताता है।

यदि मैं बस समर्थन का समर्थन करता हूं और संबंधित ऑडिट टेबल बना देता हूं, तो वे खाली हो जाएंगे, इसलिए जब मैं किसी मौजूदा इकाई को अद्यतन करता हूं, तो एनवर्ड्स नए मान रिकॉर्ड करने वाले ऑडिट तालिका में एक रिकॉर्ड जोड़ देगा, लेकिन मैं खो दूंगा पूर्व मान।

मुझे मौजूदा डेटाबेस के साथ किसी एप्लिकेशन को एन्वरर्स समर्थन कैसे जोड़ना चाहिए?

+0

हाय! क्या आपने अपनी समस्या हल की है? मैं भी एक ही समस्या आ रही है .. – gipinani

+0

नहीं, मैं Envers पर पर दे दिया और सम्मिलित करें और पर अद्यतन डेटाबेस पर इस्तेमाल किया चलाता है –

उत्तर

2

वर्तमान में इसके लिए कोई अंतर्निहित समाधान नहीं है।

"सही" तरीका एक एसक्यूएल स्क्रिप्ट (या मैन्युअल रूप से मैन्युअल रूप से) को "0" संशोधन लिखना होगा, साथ ही साथ प्रत्येक मौजूदा इकाई के लिए उस संशोधन के लिए लेखापरीक्षा रिकॉर्ड सम्मिलित करें।

वास्तव में, यह एक सामान्य रूप से अनुरोधित सुविधा है, इसलिए यदि आप योगदान देना चाहते हैं, तो इसका स्वागत होगा!

+0

के बाद से संशोधन वैश्विक है, और एक विशेष इकाई के लिए स्थानीय नहीं हैं, मुझे डर है कि एक "0" जोड़ने हूँ संशोधन कि, सभी संस्थाओं को प्रभावित करता है पिछला पुनरीक्षण के लिए क्वेरी टूट जाएगा के बाद से, जब मैं "0" संशोधन के लिए क्वेरी यह पूरे डेटाबेस लोड करने की कोशिश करेगा यह एक समस्या नहीं हो सकता है? –

+0

@DanielSerodio Adamw सही है। आपको संशोधन 0 जोड़ना होगा और उस पर अपने मौजूदा डेटाबेस के लिए शुरू करना होगा। यदि वर्तमान में कोई ऑडिटिंग नहीं है तो आप पिछले संशोधन कैसे प्राप्त कर सकते हैं? – RNJ

+0

@RNJ के बाद आप ऊपर मेरी टिप्पणी के बाद जल्दी से कहा, मुझे यकीन है कि आपको लगता है कि टिप्पणी (वैश्विक संशोधन के बारे में) देखा नहीं हूँ। क्या आपको लगता है कि यह एक समस्या होगी? –

1

आपको मैन्युअल आवेषण करने की आवश्यकता होगी। जैसे

INSERT INTO z_envers_revisions (ID, timestamp, user_id, user_name) values (1, round((sysdate - to_date('19700101','YYYYMMDD')) * 86400000) , 42, 'UserName'); 

INSERT INTO z_Table1(rev, revtype, id, description, name) select 1 as rev, 0 as revtype, id, description, name from Table1; 
INSERT INTO z_Table2(rev, revtype, id, description, name) select 1 as rev, 0 as revtype, id, description, name from Table2; 

मैं az यहाँ के साथ अपने लेखा परीक्षा टेबल पहले से जुड़ा हुआ है कुछ इसे कम करने के लिए

0

जहां तक ​​envers का संबंध है, बुनियादी उपयोग के मामले एक इकाई की पूरी लेखा परीक्षा (पैरामीटर हम रिकॉर्ड करने के लिए है @Audited एनोटेशन के माध्यम से करना चाहते हैं)। जिस मामले का आप उल्लेख कर रहे हैं, नई संस्थाओं को ठीक से जोड़ा जा सकता है लेकिन मौजूदा के लिए यह मुद्दा देगा क्योंकि लेखापरीक्षा तालिका में कोई संशोधन नहीं है।

के एक परिदृश्य की मदद से मामले को हल करते हैं:

मान लीजिए कि इकाई हम ध्यान में रखा है उपयोगकर्ताओं में है। तालिका जो अब इतिहास का निरीक्षण करने के लिए बनाई गई है, मान लें, उपयोगकर्ता_audit है। इसके अतिरिक्त revinfo किसी दिए गए रिकॉर्ड में सभी परिवर्तनों को देखने और रिकॉर्ड करने के लिए भी होगा।

पहली जगह में समस्या आती है, क्योंकि जब भी कोई अपडेट होता है, तो दृढ़ता परत एक संशोधन रिकॉर्ड नहीं ढूंढ पाती है। तो इसे ठीक करने के लिए सभी मौजूदा प्रविष्टियों को तालिका में उपस्थित होना आवश्यक है और revinfo तालिका के साथ विदेशी कुंजी मैपिंग तोड़ना नहीं चाहिए। इसलिए, दो चीजों के लिए किया जाना आवश्यक हैं:

  1. revinfo तालिका में अस्थायी मान डालें ताकि राजस्व users_audit को तालिका उपयोगकर्ताओं से डेटा के रूप में एक विदेशी कुंजी
  2. कॉपी कार्य कर सकते हैं तालिका।

नमूना फ़ाइल Liquibase इस तरह हो सकता है:

CREATE TABLE `revinfo` (
     `rev` int(11) NOT NULL AUTO_INCREMENT, 
     `revtstmp` bigint(20) DEFAULT NULL, 
     PRIMARY KEY (`rev`) 
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 

    INSERT INTO `revinfo` (`revtstmp`) select updated_at from users u; 

    SET @position := 0; 

    insert into users_audit (
    rev, 
    revtype, 
    id, 
    name, 
    type, 
    mobile_number, 
    password, 
    parent_id, 
    profile_image_uri, 
    is_active, 
    created_at, 
    updated_at 
    ) select @position := @position +1, 0, 
    id, 
    name, 
    type, 
    mobile_number, 
    password, 
    parent_id, 
    profile_image_uri, 
    is_active, 
    created_at, 
    updated_at from us 
संबंधित मुद्दे