1。权限问题:在OA项目了所用的权限系统是控制在树形结构里的节点上(即某个人或组对此节点或节点下的资源是否有(访问,操作)权限,用XML保存)。到了后来的审批流设计(OA的一个比较核心工作模块)中,发现某些关键文档的权限必须加以控制(即某篇文档只允许某些人或某些组(访问,操作))。这些与原来的权限相冲突。后来的解决办法是在和审批流程相关的模块中,原来靠节点识别权限的功能作废,用一张专门的文档权限对应表记录权限,这样实现架构很不稳定,不完善,灵活度也很底。和系统其他的部分结合不够。以后的权限问题需要一个整体的和其他系统能够结合的设计。比如有一个接口getauthority(ID,userID),ID可能为节点或者是文档ID,就能返回该userID对应的所有权限。
2。数据库的并发冲突(即用户在打开一篇文档进行编辑的时候,用的时间可能有点长,结果另外一个有权限的人对该文档已经修改了,结果数据不统一),现行系统由于同时在线用户比较少没有考虑到这个问题。以后要注意。所谓并发控制就是指在用户数据修改的过程中保证该数据不被覆盖或改变的方式。某些DBMS系统支持一个称作"时间戳(timestamp)"的数据项来控制并发性。每张表中都有一个时间戳的数据列,当Insert语句或Update语句对数据行作修改时该列自动被修改为当前时间。当你要作修改时,where子句可检查时间戳列在查询时和修改时两个值是否相符,以此来确保您做出的修改不会覆盖别人的修改,因此这种确认方式与key and Updateable Columns选项相同。即使两个用户对同一行的不同列作修改,后一个修改者也将失败。在常用的关系型数据库中Sybase和Microsoft的SQL Server支持时间戳的使用。
如果您所用的数据库不支持时间戳但支持触发器,您也可以在表中增加一列整数型的列。当有对表中某种记录作修改时,该列自动加1。下列使用的是Watcom数据库,对Shipper表增加Updcnt字段并作两个触发器,这样任何用户或进程试图修改某行记录时,该字段均可发生变化。
对INSERT触发器的编写如下:
DROP TRIGGER INS—SHIPPER’
CREATE TRIGGER SHIPPER BEFORE INSERT ON SHIPPER
REFERENCING NEW AS Newvalue
FOR EACH ROW
BEGIN
SET newvalue.UpdCnt=newvalue.UpdCnt+1;
END'
同理可编写UPDATE触发器。
在您的PowerBuilder应用之中,除表的主键外,必须再加上这一列作为检测列加入Update语句中的Where子句中,这样再作Update操作时,后台数据库会比较修改时与用户作Retrieve操作时数据是否相等,以确认是否能作修改。在DataWindows中在Specify Update Characteris-tics的对话框的右下角的Unique key column(s)中加上Updcnt一项,同时注意where clause中选择Key columns,这样PowerBuilder在构造where子句时就会认为Updcnt亦是表的主键,而成为检测项。
当数据窗口的Update函数被调用后,触发器将修改过记录中的Updcnt列表为新值,为保证下一次修改能够有效,您应当立即作Retrieve()以使DataWindow缓冲区中Updcnt的值与数据库相同。显然修改后立即查询的代价要比其他任何一种并发控制的代价要小得多。
3。 文档的归档和搜索。现系统没有对文档的统一归档功能。如果要改进我的设想是设计一张表专门维护所有的文档,主要有几个字段:ID(所有文档的ID,都必须唯一,并且非自增长的。),文本(TEXT,二进制大对象,以XML的方式记录文档的主要内容,XML结构如<英文字段名 属性=‘中文字段’ >字段的值</英文字段名>),URL(文档的超连接地址),authority(该文档的访问权限),module(文档所属的模块)。如果实现了上面的文档统一归档,搜索就可以在一张表里实现,不要跨模块和表查询了,可以考虑把文档的所以主体内容全部设计到一张表中。4。对数据库的操作尽量用ADO.NET的参数,防止SQL注入攻击。最好能重写日志类。在发生错误的时候,自动发邮件。页面导向也最好有一个方法直接计算出要导向的页面路径而不在程序里写死。
5。最近发现百度的爬虫在搜索客户上传到网站上的机密文档,做 了robot文件也没有用,看来要用加密的二进制存储。