我目前有一个数据库,许多用户可以访问并进行更改。它也是一个日志数据库,使用触发器存储数据库中表的所有更改。
我想添加在数据库中更改之前批准修改的功能。
最好的方法是什么?
答案 0 :(得分:1)
我们在其中一个网站上有类似内容,我们添加了一堆表:
users
sites
...等
然后我们有一堆影子表:
users-shadow
sites-shadow
...等
影子表与实际表具有相同的结构,除了为进行更改的用户添加的行。因此,当需要批准其数据库操作的用户提交更改时,首先我们使用此查询:
REPLACE INTO users-shadow (user_mod,id,username,password,salt...) VALUES (16,50,'bob','stuff','salt'...);
显然,确保注意不开放,使用prepared statements等。
批准后,只需从shadow
表中删除shadow
表中的一行,删除user_mod
值并将更改(非空值)插入实际表中(如果使用REPLACE语法指定了id
,则进行更新。我们在perl中执行这个逻辑,所以遗憾的是没有任何SQL。
请记住,SQL REPLACE
执行DELETE
和INSERT
而不是UPDATE
。您将需要修改任何触发器以允许此行为。
注意:我们没有使用'approve'标志的原因是我们需要能够修改现有记录,当然我们不能拥有多个具有相同主键的记录。
答案 1 :(得分:0)
我已经制作了一次这个系统,这是我的DB结构和所有算法的解决方案:
应该有一个管理面板的子系统,不同的用户可以管理他们的产品,但每个更改都应该在影响主产品表之前由管理员批准。主要有三个表:
1.Product:存储最终批准并在整个系统中使用的产品 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,系统将提取其相关更改记录并将它们放在提取的产品行的右列中(暂时只是用于显示),所以即使用户有任何待处理状态更改,他/她也可以在他/她的面板中看到它的更改(不是主系统,只有他/她的面板)。
如果系统管理员接受用户的change_version版本及其相关的更改记录,系统应将每个更改表记录放在产品表的右栏中(例如我使用的产品表,使用此系统可以进行版本控制和管理批准任何表格。)并将版本记录状态更改为已批准,并将其更改相关记录更改为已批准。因此,使用此结构,您可以保存和版本化不同的表,并保持每个版本的更改日志。