我管理一个在线目录。目前内部人员手动更新,他们的更改立即可见.现在我们想增加一个验证步骤:汤姆做了一个改变,曾傑瑞同意了。
我看到了两条路,但这两条路都不优雅。
这两种方法似乎都需要大量的代码来管理事务,而且每当表的结构发生变化时,工作量就会增加一倍。
有更好的办法吗?如果有关系,数据库管理系统是Server,web应用程序是asp.net。
编辑添加:
假设SupplierID 99的供应商有两种产品。(产品只能属于一个SupplierID。)供应商的电话号码已经改变,所以我克隆供应商的记录,更改电话号码,并标记它‘待定’。但是新唱片的ID不能是99,所以已经没有办法将它连接到它的产品,甚至是它打算替换的记录。
我想我可以添加一个不受约束的标识符SupplierPseudoID,但是这看起来和上面的想法一样复杂和容易出错。
发布于 2010-02-19 20:49:36
你为什么需要一份桌子的副本?为什么不直接在表上添加一个approved字段呢?
回答编辑:
如果你有一张桌子
id | name | text | modified | etc
-----------------------------------
1 | aaaa | blabla | 20100210 | xxx
2 | bbbb | yadayada| 20100212 | yyy
3 | cccc | asdfkad | 20090102 | zzz您只需修改它以添加一个名为appoved的新字段,并使主键同时为id和modified
id | name | text | modified | etc | approved
-----------------------------------------------
1 | aaaa | blabla | 20100210 | xxx | 1
2 | bbbb | yadayada| 20100212 | yyy | 1
3 | cccc | asdfkad | 20090102 | zzz | 1
3 | cccc | qwerklj | 20100219 | zzz | 0您创建的视图只会为您带来
id | name | text | modified | etc
-----------------------------------
1 | aaaa | blabla | 20100210 | xxx
2 | bbbb | yadayada| 20100212 | yyy
3 | cccc | asdfkad | 20090102 | zzz通过将其定义为类似于SELECT id, name, text, modified, etc FROM catalog WHERE approved = 1;的内容,您只需修改查询从中选择的“表”即可。为了避免修改插入,您应该为已批准的默认值0提供一个默认值,并修改更新查询以执行以下操作
INSERT INTO catalog (id, name, text, modified, etc, approved)
VALUES (SELECT id, name, text, NOW(), etc, 0)最后的结果是
id | name | text | modified | etc | approved
-----------------------------------------------
1 | aaaa | blabla | 20100210 | xxx | 1
2 | bbbb | yadayada| 20100212 | yyy | 1
3 | cccc | asdfkad | 20090102 | zzz | 1
3 | cccc | qwerklj | 20100219 | zzz | 0为了“批准一个字段”,您必须做的新的接口位必须:
UPDATE catalog SET approved = 1;
DELETE FROM catalog WHERE id = @id AND approved = 1 AND MIN(modified);这会导致
id | name | text | modified | etc | approved
-----------------------------------------------
1 | aaaa | blabla | 20100210 | xxx | 1
2 | bbbb | yadayada| 20100212 | yyy | 1
3 | cccc | qwerklj | 20100219 | zzz | 1如果使用触发器或存储过程来执行此操作,则可以进一步简化最后一步。
这是一个非常模糊的例子,适应你的需要。
发布于 2010-02-19 20:56:22
我将有一个已批准的字段,并且我将在该字段上设置一个触发器,该触发器将对经过验证的状态的更改限制为只来自指定审批角色的用户(如果您没有为您的用户设置角色或组类型,那么您也需要这样做,以便您知道谁是授权用户和审批人。那样的话,如果萨姆想批准自己的改变,那就不可能了。我可能也会有一个机制来检查,以确保一个批准人,谁作出改变,必须由另一个人批准他的改变。
您的应用程序还必须进行更改,以使目录的一般用户只看到已批准的更改,除非他们是发起更改的人或批准者。
发布于 2010-02-19 21:19:02
只需使用状态对重要表进行版本。
相同的表,只是额外的行。向表中添加“生效日期”范围。
select * from catalog where item_code = '1234' and status = 'APPROVED' and
today >= start_date and (today <= end_date or end_date is null)当您希望更改数据时,复制行,将状态更改为“审阅”(或其他任何步骤,无论您有多少步骤)。
那么你的评审员就能看到了。
当您“发布”时,当前的“已批准”变成“归档”,end_date =“今天”,而“评审”行变成“接受”,并带有空的end_date和start_date =“row”。
这其中的好处是,如果您愿意,快速地“回滚”一个更改是相当微不足道的,而且您总是有自己的历史。稍后,如果您愿意的话,您可以清除旧的存档数据。
你也可以在一个月的第一天才开始出售(或其他什么)商品。
https://stackoverflow.com/questions/2299372
复制相似问题