Контроль версий данных MySQL - PullRequest
       19

Контроль версий данных MySQL

4 голосов
/ 08 февраля 2011

Есть ли способ настроить MySQL на то, чтобы каждый раз при изменении строки создавалась строка в другой таблице / базе данных, с которой изначально были данные?(с отметкой времени)

Если да, то как мне это сделать?

Например

UPDATE `live_db`.`people`
SET    `live_db`.`people`.`name` = 'bob'
WHERE  `id` = 1;  

Причины этого происходят до обновления:

INSERT INTO `changes_db`.`people`
SELECT *
FROM   `live_db`.`people`
WHERE  `live_db`.`people`.`id` = 1;  

И если вы сделаете это снова, это приведет к чему-то вроде этого:

`live_db`.`people`
+----+-------+---------------------+
| id | name  | created             |
+----+-------+---------------------+
| 1  | jones | 10:32:20 12/06/2010 |
+----+-------+---------------------+

`changes_db`.`people`
+----+-------+---------------------+
| id | name  | updated             |
+----+-------+---------------------+
| 1  | billy | 12:11:25 13/06/2010 |
| 1  | bob   | 03:01:54 14/06/2010 |
+----+-------+---------------------+

В действующей БД должна быть создана метка времени в строках, а в БД изменений - времяотметка о том, когда была обновлена ​​текущая строка БД.БД изменений также не будет иметь первичных ключей и ограничений внешнего ключа.

Я использую InnoDB и MySQL 5.1.49, но могу обновить при необходимости.

Ответы [ 4 ]

4 голосов
/ 08 февраля 2011

Использовать триггер

Поддержка MySQL для триггеров началась с версии MySQL 5.0.2.

2 голосов
/ 10 февраля 2011

Вы можете создать триггер :

DELIMITER \\
CREATE TRIGGER logtrigger BEFORE UPDATE ON live_db.people
FOR EACH ROW BEGIN
    INSERT INTO changes_db.people(id,name,updated) VALUES(OLD.id,OLD.name,now());
END;
\\
1 голос
/ 09 февраля 2011

Вот как я это сделал

DELIMITER |

# Create the log table
CREATE TABLE IF NOT EXISTS `DB_LOG`.`TABLE`
LIKE `DB`.`TABLE`|

# Remove any auto increment
ALTER TABLE `DB_LOG`.`TABLE` CHANGE `DB_LOG`.`TABLE`.`PK` `DB_LOG`.`TABLE`.`PK` INT UNSIGNED NOT NULL|
# Drop the primary keys
ALTER TABLE `DB_LOG`.`TABLE` DROP PRIMARY KEY|

#Create the trigger
DROP TRIGGER IF EXISTS `DB`.`update_TABLE`|
CREATE TRIGGER `DB`.`update_TABLE` BEFORE UPDATE ON `DB`.`TABLE` FOR EACH ROW
BEGIN
    INSERT INTO `DB_LOG`.`TABLE`
    SELECT `DB`.`TABLE`.*
    FROM `DB`.`TABLE`
    WHERE `DB`.`TABLE`.`PK` = NEW.`PK`;
END|

DELIMITER ;
0 голосов
/ 15 февраля 2013

Извините за комментарий к старому сообщению, но я пытался решить эту проблему! Думал, что поделюсь этой информацией.

Это идеально описывает решение:

http://www.hirmet.com/mysql-versioning-records-of-tables-using-triggers

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...