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