2013-02-22 74 views
4

是否有任何有用的工具或技巧來自動(或快速)爲MySQL中的給定表創建歷史表+觸發器? I've come across this tool so far,但它一段時間還沒有更新。如果相關,我使用MySQL Workbench的「模型」工具來構建我的數據庫模型,然後將這些模型與我的本地數據庫進行同步。加快或自動創建歷史表觸發器

我希望能夠爲表提供創建腳本並讓這個工具神奇地吐出爲歷史表創建腳本,並在插入/更新/刪除時將觸發器插入到這些歷史表中。舉例來說,如果我有表foo複合PK ab,外鍵cd和屬性ef,它會產生創造了歷史表foo_history腳本複合PK abrevisionNumcde,f,從cd中刪除關係 - 加上可能是指示操作時間的列以及它是否是INSERT/UPDATE/DELETE。

我很樂意生成這樣的腳本,如果它不存在,就共享它,但如果它真的存在,我不想重新發明它。如果不這樣做,那麼您認爲最適合其他人使用這種腳本的最方便的格式/您將如何將其應用到模型開發工作流程中?

+0

ħ我,你是怎麼解決這個問題的? – biziclop 2013-02-25 21:27:09

+1

@biziclop,我還沒決定 - 我看了一下你的腳本,它非常好。我仍然可以嘗試自己開發一些東西,但是如果我這樣做了,它將成爲現有的建模或管理系統(如Workbench或PHPMyAdmin)的插件,因此它可以更好地集成到指定數據庫的體驗中。無論如何,您的腳本+1。我會更新這篇文章,如果我真的去實際做到這一點。 – 2013-02-27 03:29:36

回答

2

我爲自己創建了這個小怪物php腳本,它可以從一些簡短的txt文件生成SQL DDL,現在它可以生成歷史記錄表和它的CREATE TRIGGER語句。

http://simpleddl.coolpage.biz/

示例源:

// ZZZ means "Create History Table + Triggers" 
// you can try editing it live at the link above 

!DROP 
= ID id P AI 

person ZZZ 
    ID 
    name _ 
    N mother_id -> person 
    N father_id -> person 
    !FK mother_id, father_id -> family 

family ZZZ 
    P female_id -> person 
    P male_id -> person 

產生的SQL的DDL:

DROP TABLE IF  EXISTS person; 
CREATE TABLE IF NOT EXISTS person (
    id   INT NOT NULL AUTO_INCREMENT, 
    name  VARCHAR(255) NOT NULL, 
    mother_id INT NULL, 
    father_id INT NULL, 
    PRIMARY KEY (id), 
    FOREIGN KEY (mother_id) REFERENCES person(id), 
    FOREIGN KEY (father_id) REFERENCES person(id), 
    FOREIGN KEY (mother_id, father_id) REFERENCES family(female_id, male_id) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; 

DROP TABLE IF  EXISTS family; 
CREATE TABLE IF NOT EXISTS family (
    female_id INT NOT NULL, 
    male_id INT NOT NULL, 
    PRIMARY KEY (female_id, male_id), 
    FOREIGN KEY (female_id) REFERENCES person(id), 
    FOREIGN KEY (male_id) REFERENCES person(id) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

DROP TABLE IF  EXISTS zz_person; 
CREATE TABLE IF NOT EXISTS zz_person (
    id   INT NOT NULL, 
    name  VARCHAR(255) NOT NULL, 
    mother_id INT NULL, 
    father_id INT NULL, 
    _zz_id  INT NOT NULL AUTO_INCREMENT, 
    _zz_op  CHAR(1) NOT NULL, 
    _zz_date datetime NOT NULL, 
    PRIMARY KEY (_zz_id), 
    INDEX P (id), 
    INDEX (father_id, mother_id), 
    INDEX (_zz_op), 
    INDEX (_zz_date) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; 

DROP TABLE IF  EXISTS zz_family; 
CREATE TABLE IF NOT EXISTS zz_family (
    female_id INT NOT NULL, 
    male_id INT NOT NULL, 
    _zz_id  INT NOT NULL AUTO_INCREMENT, 
    _zz_op  CHAR(1) NOT NULL, 
    _zz_date datetime NOT NULL, 
    PRIMARY KEY (_zz_id), 
    INDEX P (male_id, female_id), 
    INDEX (_zz_op), 
    INDEX (_zz_date) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; 


DROP TRIGGER IF EXISTS INSERT_ON_person; 
CREATE TRIGGER   INSERT_ON_person 
        AFTER INSERT ON person 
FOR EACH ROW INSERT INTO 
zz_person ( id,  name,  mother_id,  father_id, _zz_date, _zz_op) 
    VALUES (NEW.id, NEW.name, NEW.mother_id, NEW.father_id, NOW() , 'i' ); 

DROP TRIGGER IF EXISTS UPDATE_ON_person; 
CREATE TRIGGER   UPDATE_ON_person 
        AFTER UPDATE ON person 
FOR EACH ROW INSERT INTO 
zz_person ( id,  name,  mother_id,  father_id, _zz_date, _zz_op) 
    VALUES (NEW.id, NEW.name, NEW.mother_id, NEW.father_id, NOW() , 'u' ); 

DROP TRIGGER IF EXISTS DELETE_ON_person; 
CREATE TRIGGER   DELETE_ON_person 
        AFTER DELETE ON person 
FOR EACH ROW INSERT INTO 
zz_person ( id,  name,  mother_id,  father_id, _zz_date, _zz_op) 
    VALUES (OLD.id, OLD.name, OLD.mother_id, OLD.father_id, NOW() , 'd' ); 

DROP TRIGGER IF EXISTS INSERT_ON_family; 
CREATE TRIGGER   INSERT_ON_family 
        AFTER INSERT ON family 
FOR EACH ROW INSERT INTO 
zz_family ( female_id,  male_id, _zz_date, _zz_op) 
    VALUES (NEW.female_id, NEW.male_id, NOW() , 'i' ); 

DROP TRIGGER IF EXISTS UPDATE_ON_family; 
CREATE TRIGGER   UPDATE_ON_family 
        AFTER UPDATE ON family 
FOR EACH ROW INSERT INTO 
zz_family ( female_id,  male_id, _zz_date, _zz_op) 
    VALUES (NEW.female_id, NEW.male_id, NOW() , 'u' ); 

DROP TRIGGER IF EXISTS DELETE_ON_family; 
CREATE TRIGGER   DELETE_ON_family 
        AFTER DELETE ON family 
FOR EACH ROW INSERT INTO 
zz_family ( female_id,  male_id, _zz_date, _zz_op) 
    VALUES (OLD.female_id, OLD.male_id, NOW() , 'd' ); 

測試撥弄:

http://sqlfiddle.com/#!2/d05e6/1

0

我只是寫一個工具來查詢表的架構,然後生成腳本來手動運行。只需使用您最喜歡的語言的簡單代碼生成器。

作爲一個說明,我會建議編寫腳本來刪除您已經腳本的對象。只是在最初幾次出錯時幫助清理。