我管理在线目录。目前,内部人员手动更新,他们的更改立即可见。现在我们要添加一个验证步骤:Tom做出改变,Jerry批准了。
我看到两条路,但似乎都不优雅。
这两个似乎只需要很多代码用于内务处理,并且只要表的结构发生变化就会使工作量增加一倍。
有更好的方法吗?如果重要,DBMS是SQL Server,Web应用程序是asp.net。
已编辑添加:
我上面概述的两个更改都与现有代码向后兼容。我知道我将不得不进行一些更改,但我不能改变每个查询。
我认为我的主要限制条件禁止只是克隆行并将其标记为“待定”。
假设供应商ID为99的供应商有两种产品。 (产品只能属于一个SupplierID。)供应商的电话号码已更改,因此我克隆了供应商记录,更改了电话号码,并将其标记为“待处理”。但新记录的ID不能为99,因此不再有办法将其连接到其产品或甚至是它要替换的记录。
我想我可以添加一个无约束的标识符SupplierPseudoID,但这似乎与上述想法一样复杂且容易出错。
答案 0 :(得分:6)
为什么需要表格的副本?为什么不在表格中添加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
如果您使用触发器或存储过程来执行此操作,则可以进一步简化此最后一位。
这是一个非常模糊的例子,可以适应您的需求。
答案 1 :(得分:1)
我会有一个已批准的字段,我会在该字段上触发一个限制更改到已批准状态的更改仅来自指定的批准者角色的用户(如果您没有角色或组类型的东西)对于您的用户,您还需要知道谁是授权用户和批准者。这样如果Sam试图批准他自己的更改,就不会发生。我可能还会有一个检查机制来确保批准者是谁做出改变必须让他的变更得到另一个人的批准。
您的应用程序也必须更改为让目录的一般用户只能看到已批准的更改,除非他们是发起更改的人或批准者。
答案 2 :(得分:1)
只需使用状态版本显示您的重要表格。
相同的表,只是额外的行。 在表格中添加“生效日期”范围。
select * from catalog where item_code = '1234' and status = 'APPROVED' and
today >= start_date and (today <= end_date or end_date is null)
当您想要更改数据时,请复制该行,将状态更改为“REVIEW”(或者无论您执行多少步骤)。
然后你的评论员可以看到。
当你“发布”时,当前的“APPROVED”变为“ARCHIVED”,end_date =“today”,“REVIEW”行变为“ACCEPTED”,其中null为end_date,start_date =“today”。
这很好的部分是,如果你愿意,快速“回滚”一个变化是相当微不足道的,而且你总是有历史。之后,如果您愿意,可以清除旧的ARCHIVED数据。
您还可以在本月的第一天之前预售未上市(或其他)的商品。