2013-05-22 61 views
2

我目前有一個數據庫,許多用戶可以訪問和進行更改。這也是一個日誌數據庫,它使用觸發器在數據庫中存儲對錶的所有更改。數據庫編輯與審批 - mysql

我想在數據庫中更改之前添加批准修改的功能。

什麼是最好的方式去做這件事?

回答

1

我們對我們網站的一個類似的東西,我們已經添加了一堆表:

userssites ...等

然後,我們有一大堆的影子表:

users-shadowsites-shadow ...等

影子表具有與真實表相同的結構,除了爲進行更改的用戶添加了一行外。所以首先我們使用此查詢時,一個變化是由誰需要有批准了他/她的數據庫操作的用戶提交:

REPLACE INTO users-shadow (user_mod,id,username,password,salt...) VALUES (16,50,'bob','stuff','salt'...); 

顯然,確保這是不開放給注射,使用prepared statements

當批准,在shadow表中的一行被簡單地從shadow表中刪除,插入到真實表(或者如果指定了id更新user_mod值下降和變化(非空值),採用REPLACE語法)。我們在perl中執行這個邏輯,所以很遺憾沒有任何SQL。

請記住,SQL REPLACE做了DELETEINSERT而不是UPDATE。您將需要修改任何觸發器以允許此行爲。

注意:我們沒有使用「批准」標誌的原因是我們需要修改現有記錄的能力,當然我們不能有多個具有相同主鍵的記錄。

0

以及我取得了這個系統一次,這裏是我的數據庫結構,對所有的算法解決方案:

應該有管理面板的一個子系統,不同的用戶可以管理自己的產品,但每一個變化應該是在影響主要產品表之前由管理員批准。有三個主表:

1.產品:存儲已批准並在整個系統中使用的產品 2.Changes_versions:與產品表有一對多關係的表,表示每個更改版本由誰承擔的時候,並已被批准/由管理員拒絕或仍處於待定狀態。表結構如下:

CREATE TABLE changes_versions(
xid int(11) unsigned NOT NULL AUTO_INCREMENT, 
xcreated_date datetime DEFAULT NULL, 
xupdated_date timestamp NULL DEFAULT NULL, 
xversion int(11) DEFAULT NULL, 
xobject_id int(11) DEFAULT NULL, 
xobject_type varchar(255) DEFAULT NULL, 
xstate enum('PENDING','ACCEPTED','REJECTED') DEFAULT 'PENDING', 
    PRIMARY KEY (xid) 
) ENGINE=InnoDB AUTO_INCREMENT=165 DEFAULT CHARSET=utf8 

3.Changes:一個表,有一個要與Changes_versions表中的許多關係,即保持每列的變化主表的記錄(這裏我是指產品表),並通過管理員批准change_version記錄將其相關的更改記錄放置在主表列中。表結構如下:

CREATE TABLE changes(
xid int(11) unsigned NOT NULL AUTO_INCREMENT, 
xcreated_date datetime DEFAULT NULL, 
xcreated_by varchar(255) DEFAULT NULL, 
xupdated_date timestamp NULL DEFAULT NULL, 
xupdated_by varchar(255) DEFAULT NULL, 
xversion_id int(11) DEFAULT NULL, 
xcolumn_name varchar(255) DEFAULT NULL, 
xcolumn_value varchar(255) DEFAULT NULL, 
xstate enum('PENDING','ACCEPTED','REJECTED') DEFAULT 'PENDING', 
xadmin_review text, 
    PRIMARY KEY (xid) 
) ENGINE=InnoDB AUTO_INCREMENT=764 DEFAULT CHARSET=utf8 

與本系統和表模式我處理與記錄的更改工作,用戶獲取的記錄列表中,如果用戶有任何待定狀態change_version,系統將拉動其相關的變更記錄和地點他們在提取的產品行的右列(臨時僅用於顯示),因此即使用戶有任何掛起的狀態改變,他/她也可以在他/她的面板(不是主系統,只有他/她的面板)看到其改變。

最後如果系統管理員接受用戶changes_version版本及其相關更改記錄,系統應該將每個更改表記錄放在產品表的右欄(例如我使用的產品表,使用此係統可以進行版本控制和管理員批准任何表)。並將版本記錄狀態更改爲已批准,並將其更改相關記錄批准爲已批准。所以通過這種結構,您可以保存和版本化不同的表格並保存每個版本更改的日誌。