Jump to content
Sign in to follow this  
samuraisxmali

ბაზაში ძველი მონაცემების შენახვა და კონტროლი (c) V1RUS

Recommended Posts

mysql-ში მაქვს ბაზა, უკვე საიტის აწყობა უნდა დამეწყო და მომთხოვეს რომ ისე გააკეთე რომ ყველა მონაცემის ძველი ვერსია შეინახო, ასევე ვინ რა და სად შეცვალა, ამ ყველაფრის ნახვა საიტზე უნდა შეიძლებოდეს. ბაზის სტრუქტურა როგორ გავაკეთო ეგ მაინტერესებს. ამაზე გასაგებად რაღა ვთქვა  :blush: რაღაც იდეები მაქვს მარა ვინმეს თუ გაგიკეთებიათ ესეთი რამე იქნებ ამიხსნათ 

გავაკეთე უკვე მგონი

 

 

მარტივად გააკეთებ თუ კი იცი ტრიგერები რა არის. მაგალითად თუ გაქვს ცხრილი news ,აკეთებ ცხრილს news_log (რომელის ველებიც იქნება old_news_ცხრილის ველები და new_news_ცხრილის ველები )  და news ცხრილზე აკეთებ ტრიგერს before insert or update or delete

ამ ტრიგერებზე შესაბამისად ინახავ new და old მნიშვნელობებს news_log ცხრილში. 

 

შესაბამისად ღებულობ მთელ სურათს ვინ სად როდის როგორ და რანაირად და რა შეცვლა. ისე რომ არ ერევი გარედან ბაზის დონეზევე აკეთებ მაგ ყველაფერს.

 

მაგალითად გვაქ ცხრილი news და გვინდა ამ ცხრილზე ყველა ცვლილების და ისტორიის შენახვა. 

  news აქვს 3 ველი პირობითად id,news_text,user_id  ამ ცხრილის ისტორიის შესანახად ვაკეთებთ ცხრილს

  news_log 7 ველი გვექნება  id <<log ის უბრალოდ id

  old_id,old_news_text,old_user_id << აქ შევინახავთ ძველ მნიშვნელობებს ჩანაწერის news ცხრილიდან.

  new_id,new_news_text,new_user_id << აქ შევინახავთ ახალ მნიშვნელობებს ჩანაწერის news ცხრილიდან.

  

 ვაკეთებთ ტრიგერს BEFORE UPDATE ON `news` სადაც ვახდენთ news ცხრილის ძველი და ახალი მნიშვნელობის ლოგერში ჩასმას. ანუ ვღებულობთ სურათს რა იყო და რა გახდა.

  ქვემოთ ჩემს მოყვანილ მაგალითს თუ შეხედავ მაქ ესეთი ჩანაწერი ლოგერში 

(  1, 1, 'test', 5 <<ძველი, 1, 'xaxa', 6<< ახალი) ანუ ეს ნიშნავს რედაქტირების წინ იყო  1, 'test', 5 ჩანაწერი და დაარედაქტირეს და გახდა  1, 'xaxa', 6.

 

ანალოგიურად შეგიძლია ტრიგერი დაადო before delete ოღონდ delete  ში new მნიშვნელობა იქნება ცარიელი ხოლო რა წაიშალა შესაბამისად შეივსება.

 

ლოგავ უკვე ყველანაირა მოძრაობებს ცხრილში ისე რომ გარედან არანაირი ჩარევა არ უნდა ბაზის დონეზე ხდება, შემდეგ ეს ისტორია ლამაზად შეგიძლია დაუხატო გაუფორმო. აქ ეხლა პრიმიტიული მაგალითია ლოგერს შეგიძლია ცხრილს მიუმატო თარიღი თუ როდის მოხდა ცვლილება მომხმარებლის სახელი თუ ვინ გააკეთა ცვლილება, კომპიუტერი საიდანაც მოხდა ეს ცვლილება მოკლედ

ფანტაზიაზეა უკვე დამოკდიებული შენს. მთავარია სკრიპტზე არ ხარ დამოკიდებული რაიმე რომ შეინახოს და დალოგო ბაზა აკეთებს თავისით. 

 

მარტივად ეგრე ხდება ლოგირება, და თან ხარისხიანად, ეგრე ვაკეთებ ხოლმე , MYSQLს არ ვხმარობ მაგრამ ამ შემთხვევაში ეს მიდგომა ყველა ბაზაზე ერთია მხოლოდ სინტაქსია სხვა

CREATE TABLE IF NOT EXISTS `news` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`news_text` text NOT NULL,
`user_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;



INSERT INTO `news` (`id`, `news_text`, `user_id`) VALUES
(1, 'xaxa', 6);


DROP TRIGGER IF EXISTS `test`;
DELIMITER //
CREATE TRIGGER `test` BEFORE UPDATE ON `news`
FOR EACH ROW BEGIN
insert into news_log set old_id=OLD.id,old_news_text=OLD.news_text,old_user_id=OLD.user_id,new_id=NEW.id,new_news_text=NEW.news_text,new_user_id=NEW.user_id;
END
//
DELIMITER ;



CREATE TABLE IF NOT EXISTS `news_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`old_id` int(11) NOT NULL,
`old_news_text` text NOT NULL,
`old_user_id` int(11) NOT NULL,
`new_id` int(11) NOT NULL,
`new_news_text` text NOT NULL,
`new_user_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;


INSERT INTO `news_log` (`id`, `old_id`, `old_news_text`, `old_user_id`, `new_id`, `new_news_text`, `new_user_id`) VALUES
(1, 1, 'test', 5, 1, 'xaxa', 6);
  • Upvote 2

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×