এটি করার সহজ সরল উপায়:
প্রথমে, আপনি ট্র্যাক করতে চান এমন প্রতিটি ডেটা টেবিলের জন্য একটি ইতিহাস সারণী তৈরি করুন (উদাহরণস্বরূপ কোয়েরি নীচে)। এই টেবিলটিতে প্রতিটি সারণিতে তথ্য সারণীতে প্রতিটি সারণি সম্পাদনা, আপডেট এবং মুছে ফেলা ক্যারিয়ারের জন্য একটি এন্ট্রি থাকবে।
ইতিহাস সারণীর কাঠামোটি তিনটি অতিরিক্ত কলাম ব্যতীত ডেটা টেবিলের মতো একই রকম হবে: ঘটে যাওয়া অপারেশনটি সংরক্ষণ করার জন্য একটি কলাম (আসুন একে একে 'অ্যাকশন' বলুন), অপারেশনের তারিখ এবং সময় এবং একটি কলাম সিকোয়েন্স নম্বর ('রিভিশন') সঞ্চয় করতে, যা প্রতিটি ক্রিয়াকলাপে বৃদ্ধি পায় এবং ডেটা সারণীর প্রাথমিক কী কলাম দ্বারা গোষ্ঠীভুক্ত হয়।
এই সিকোয়েন্সিং আচরণটি করতে প্রাথমিক কী কলাম এবং রিভিশন কলামে একটি দুটি কলাম (সংমিশ্রিত) সূচক তৈরি করা হয়। মনে রাখবেন যে ইতিহাসের টেবিল দ্বারা ব্যবহৃত ইঞ্জিনটি মাইএসএএম হলে আপনি কেবল এই ফ্যাশনেই সিকোয়েন্সিং করতে পারবেন ( এই পৃষ্ঠায় 'মাইআইএসএএম নোটস' দেখুন)
ইতিহাসের সারণীটি তৈরি করা মোটামুটি সহজ। নীচের ALTER TABLE ক্যোয়ারিতে (এবং তার নীচে ট্রিগার ক্যোয়ারিতে), আপনার ডেটা সারণিতে সেই কলামটির আসল নামটি দিয়ে 'প্রাথমিক_কি_ক্লোনম' প্রতিস্থাপন করুন।
CREATE TABLE MyDB.data_history LIKE MyDB.data;
ALTER TABLE MyDB.data_history MODIFY COLUMN primary_key_column int(11) NOT NULL,
DROP PRIMARY KEY, ENGINE = MyISAM, ADD action VARCHAR(8) DEFAULT 'insert' FIRST,
ADD revision INT(6) NOT NULL AUTO_INCREMENT AFTER action,
ADD dt_datetime DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER revision,
ADD PRIMARY KEY (primary_key_column, revision);
এবং তারপরে আপনি ট্রিগারগুলি তৈরি করুন:
DROP TRIGGER IF EXISTS MyDB.data__ai;
DROP TRIGGER IF EXISTS MyDB.data__au;
DROP TRIGGER IF EXISTS MyDB.data__bd;
CREATE TRIGGER MyDB.data__ai AFTER INSERT ON MyDB.data FOR EACH ROW
INSERT INTO MyDB.data_history SELECT 'insert', NULL, NOW(), d.*
FROM MyDB.data AS d WHERE d.primary_key_column = NEW.primary_key_column;
CREATE TRIGGER MyDB.data__au AFTER UPDATE ON MyDB.data FOR EACH ROW
INSERT INTO MyDB.data_history SELECT 'update', NULL, NOW(), d.*
FROM MyDB.data AS d WHERE d.primary_key_column = NEW.primary_key_column;
CREATE TRIGGER MyDB.data__bd BEFORE DELETE ON MyDB.data FOR EACH ROW
INSERT INTO MyDB.data_history SELECT 'delete', NULL, NOW(), d.*
FROM MyDB.data AS d WHERE d.primary_key_column = OLD.primary_key_column;
এবং তুমি করে ফেলেছ. এখন, 'মাইডিবি.ডাটা' -র সমস্ত সন্নিবেশ, আপডেট এবং মুছে ফেলাগুলি 'মাইডিবি.ডাটা_ইস্টিরি'তে রেকর্ড করা হবে, আপনাকে এর মতো একটি ইতিহাস সারণী প্রদান করে (বিয়োগযুক্ত' ডেটা_কলামগুলি 'কলাম)
ID revision action data columns..
1 1 'insert' .... initial entry for row where ID = 1
1 2 'update' .... changes made to row where ID = 1
2 1 'insert' .... initial entry, ID = 2
3 1 'insert' .... initial entry, ID = 3
1 3 'update' .... more changes made to row where ID = 1
3 2 'update' .... changes made to row where ID = 3
2 2 'delete' .... deletion of row where ID = 2
আপডেট থেকে আপডেট পর্যন্ত প্রদত্ত কলাম বা কলামগুলির পরিবর্তনগুলি প্রদর্শনের জন্য, আপনাকে প্রাথমিক কী এবং সিকোয়েন্স কলামগুলিতে নিজেই ইতিহাসের টেবিলে যোগদান করতে হবে। আপনি এই উদ্দেশ্যে একটি দর্শন তৈরি করতে পারেন, উদাহরণস্বরূপ:
CREATE VIEW data_history_changes AS
SELECT t2.dt_datetime, t2.action, t1.primary_key_column as 'row id',
IF(t1.a_column = t2.a_column, t1.a_column, CONCAT(t1.a_column, " to ", t2.a_column)) as a_column
FROM MyDB.data_history as t1 INNER join MyDB.data_history as t2 on t1.primary_key_column = t2.primary_key_column
WHERE (t1.revision = 1 AND t2.revision = 1) OR t2.revision = t1.revision+1
ORDER BY t1.primary_key_column ASC, t2.revision ASC
সম্পাদনা: ওহ বাহ, 6 বছর আগের লোকেরা আমার ইতিহাসের টেবিল জিনিস পছন্দ করে: পি
আমার এটির বাস্তবায়ন এখনও আরও বাজে, আরও বড় ও অস্বাস্থ্যকর হয়ে উঠছে, আমি ধরে নেব। আমি এই ডাটাবেসে ইতিহাসটি দেখতে ভিউগুলি এবং সুন্দর সুন্দর ইউআই লিখেছি, তবে আমি মনে করি না এটি কখনও বেশি ব্যবহৃত হয়েছিল। সুতরাং এটি যায়।
কোনও নির্দিষ্ট ক্রমে কিছু মন্তব্যকে সম্বোধন করতে:
আমি পিএইচপি-তে আমার নিজের প্রয়োগটি করেছি যা কিছুটা বেশি জড়িত ছিল, এবং মন্তব্যে বর্ণিত কিছু সমস্যা এড়িয়ে চললাম (সূচিপত্রগুলি হস্তান্তরিতভাবে স্থানান্তরিত করে, লক্ষণীয়ভাবে। আপনি যদি ইতিহাসের ছকে অনন্য সূচির উপর স্থানান্তর করেন তবে জিনিসগুলি ভেঙে যাবে for এর সমাধান রয়েছে) এটি মন্তব্যে)। আপনার ডাটাবেসটি কীভাবে প্রতিষ্ঠিত হয়েছে তার উপর নির্ভর করে চিঠির এই পোস্টটি অনুসরণ করা একটি দু: সাহসিক কাজ হতে পারে।
যদি প্রাথমিক কী এবং পুনর্বিবেচনা কলামের মধ্যে সম্পর্কটি বন্ধ মনে হয় তবে এর অর্থ সাধারণত যৌথ কীটি কোনওভাবে উদাস হয়। কয়েকটি বিরল অনুষ্ঠানে আমার এটি ঘটেছিল এবং কারণটির জন্য লোকসান হয়েছিল।
ট্রিগারগুলি যেমন করে তেমন ব্যবহার করে আমি এই সমাধানটি বেশ পারফরম্যান্স হিসাবে খুঁজে পেয়েছি। এছাড়াও, মাইআইএসএএম দ্রুত সন্নিবেশগুলিতে রয়েছে, যা সমস্ত ট্রিগারই করে। আপনি স্মার্ট ইনডেক্সিং (বা ... এর অভাবে) এর সাথে আরও উন্নতি করতে পারেন। প্রাথমিক কী সহ মাইআইএসএএম টেবিলের মধ্যে একটি একক সারি সন্নিবেশ করানো আপনার কোনও অপারেশন হওয়া উচিত নয়, যদি না আপনার অন্য কোথাও উল্লেখযোগ্য সমস্যা না ঘটে unless পুরো ইতিহাসে আমি মাইএসকিউএল ডাটাবেসটি চালিয়ে যাচ্ছিলাম এই ইতিহাস সারণীর প্রয়োগটি চালু ছিল, এটি কখনই উপস্থিত হওয়া (বহু) পারফরম্যান্স সমস্যার কোনও কারণ ছিল না।
আপনি যদি বারবার সন্নিবেশ পেয়ে থাকেন তবে INSERT IGNORE টাইপ প্রশ্নের জন্য আপনার সফ্টওয়্যার স্তরটি পরীক্ষা করুন। হার্মাম, এখনই মনে করতে পারে না, তবে আমি মনে করি এই স্কিম এবং লেনদেনের সাথে এমন কিছু সমস্যা রয়েছে যা শেষ পর্যন্ত একাধিক ডিএমএল ক্রিয়া চালানোর পরে ব্যর্থ হয়। কিছুটা সচেতন হতে হবে, কমপক্ষে।
ইতিহাস টেবিলের ক্ষেত্রগুলি এবং ডেটা সারণীর মিল থাকা গুরুত্বপূর্ণ। বা, বরং, আপনার ডেটা টেবিলের ইতিহাস সারণির চেয়ে আরও কলাম নেই। অন্যথায়, ডেটা টেবিলটিতে সন্নিবেশ / আপডেট / ডেল কোয়েরিগুলি ব্যর্থ হবে, যখন ইতিহাস সারণিতে সন্নিবেশগুলি অস্তিত্বহীন কোয়েরিতে কলামগুলি রাখে (ট্রিগার অনুসন্ধানে ড। * এর কারণে) এবং ট্রিগার ব্যর্থ হয়। মাইএসকিউএল-তে স্কিমা-ট্রিগারগুলির মতো কিছু থাকলে, আপনি কলাম ডেটা সারণীতে যুক্ত করা হলে ইতিহাসের টেবিলটি পরিবর্তন করতে পারেন, তবে টি দুর্দান্ত লাগবে। মাইএসকিউএল এখন আছে কি? আমি আজকাল প্রতিক্রিয়া করি: পি