我目前有一个数据库,许多用户可以访问和更改。也是一个日志数据库,它使用触发器存储对数据库中表的所有更改。
我想添加的能力,以批准编辑之前,他们被更改在数据库中。
最好的方法是什么?
发布于 2013-05-22 21:38:54
我们在我们的一个网站上有类似的东西,我们添加了一堆表:
users sites ...等
然后我们有一堆影子表:
users-shadow sites-shadow ...等
影子表具有与真实表相同的结构,除了为进行更改的用户添加了一行之外。因此,首先,当需要批准其数据库操作的用户提交更改时,我们使用以下查询:
REPLACE INTO users-shadow (user_mod,id,username,password,salt...) VALUES (16,50,'bob','stuff','salt'...);显然,请确保这不是向注入开放的,使用等。
批准后,只需从shadow表中删除shadow表中的一行,删除user_mod值并将更改(非空值)插入到实际表中(如果指定了id,则使用REPLACE语法进行更新)。我们是在perl中实现这一逻辑的,所以遗憾的是,手头没有任何SQL。
请记住,SQL REPLACE执行DELETE和INSERT,而不是UPDATE。您将需要修改任何触发器以允许此行为。
注意:我们没有使用'approve‘标志的原因是我们需要能够修改现有的记录,当然我们不能有多个具有相同主键的记录。
发布于 2017-05-31 15:41:53
好吧,我只做了一次这个系统,这是我的DB结构和所有算法的解决方案:
应该有一个管理面板的子系统,不同的用户可以管理他们的产品,但每一个变化都应该得到管理员的批准,然后才能去影响主产品表。主要有三个表:
1.产品:存放最终通过并在整个系统中使用的产品2.Changes_versions :与产品表具有一对多关系的表,表示每个变更版本由谁提交,何时提交,并被管理员批准/拒绝或仍处于待定状态.table结构如下:
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=utf83.变更:与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表,使用此系统,您可以对任何表进行版本化和管理员审批).and变更版本记录状态为已批准,其变更相关记录为已批准。因此,通过这种结构,您可以保存和版本化不同的表,并保留每个版本更改的日志。
https://stackoverflow.com/questions/16692979
复制相似问题