2013-05-22 60 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版本及其相关更改记录,系统应该将每个更改表记录放在产品表的右栏(例如我使用的产品表,使用此系统可以进行版本控制和管理员批准任何表)。并将版本记录状态更改为已批准,并将其更改相关记录批准为已批准。所以通过这种结构,您可以保存和版本化不同的表格并保存每个版本更改的日志。