在程序中, 我要对一个器材表(Equipment)进行录入新器材的操作。现在的做法是使用数据库中的一个临时器材表(TempEquip),在其中一次性生成一台或多台器材记录、然后编辑、修改之后,将TempEquip导入正式表,如果用户放弃录入,则清空TempEquip,不导入正式表。现在可能有多个用户使用该模块进行录入,如何才能保证各用户只能够看自己添加的器材。并编辑或是撤销(删除)它们,而不影响其它人录入的内容呢?我原想在TempEquip加入用户ID字段,来区别录入的数据,但可能有同ID的用户使用(比如两个人同时使用A的身份). 或是使用临时表(#TempEquip)但似乎临时表只在一个存储过程中有效,出去就找不到了。大家有什么好的办法,多多指点,谢谢啦! ^^

解决方案 »

  1.   

    从另一个角度来考虑问题, 完全独立的用户编辑, 楼主应该在客户端本机缓存数据(比较用datatable/xml), 处理完成后再一次提交服务器. 
    与服务器或者是其他用户没有什么关联的临时性缓存不应该放在服务端
      

  2.   

    使用一个表在正式表之间作为中介是为了支持批录入和撤销比如某用户可能一次要录入500条记录,这些记录中大部分字段是相同的,然后再对部分字段进行编辑.于是我在临时表里一次生成多条记录,然后由该用户进行编辑,最后提交正式表,如果用户放弃,则把这些记录删掉.现在有多个用户进行录入,我希望每个人的录入\撤销是独立的,互不影响. 不放在客户端作,主要是觉得可能一次录入几百条记录,觉得用Add在客户端插入大量数据效率有点低.而且该器材的正式表有十几万条记录,如果在录入的同时还要判断某些字段是否冲突/重复有点低效,所以在临时表里完成编辑后,在服务器上用存储过程转入正式表时进行判断。不知道我描述的是否清楚,大家给点建议好了,我数据库开发比较少,见笑了。谢谢 邹建 老大和 Hopewell_Go 朋友的关注, ^^
      

  3.   

    我觉得楼主应该在客户端UI层实现录入,先连接一次数据库,将基础数据取出,在UI层加工处理,并完成验证,然后再提交到数据库;如果楼主一定要用临时表,那完全可以根据用户ID,Computer Name,Time,客户端进程号来建主键,这样无论如何都不会重复了.
    我个人更喜欢直接在主表中Insert数据,当然也是以用户ID,Computer Name,Time,客户端进程号为主键,如果担心并发冲突,可以使用IsolationLeavel(事务的隔离级别)
      

  4.   

    把数据缓冲在内存中,建立一个动态的SQL语句:select 'A器材' as Name, 1000 as Amount,12345.65 as Price
    Union all
    select 'B器材' as Name, 1200 as Amount,22345.65 as Price增加一个记录就增加一段Union all select ...语句组成一个记录集,更新数据时把这个记录集更新到表,如以上的数据集插入一个新表里就是
    select a.* into NewTable from (select 'A器材' as Name, 1000 as Amount,12345.65 as Price Union all
    select 'B器材' as Name, 1200 as Amount,22345.65 as Price) A
      

  5.   

    jacky_gaoying(碧海长吟) ( ) 信誉:100    Blog 
    正解!
    '我原想在TempEquip加入用户ID字段'
    楼主的思路是正确的,不过,不能简单的加ID,要根据用户ID+MAC或者直接用GUID,根据唯一主健来确定一个单据的唯一.
      

  6.   

    自己用 @@spid 解决了,这几天没来csdn结贴,谢谢大家了。