描述一下问题:我有一个管理系统,在该管理系统中可以创建用户,被创建的用户可以登录该管理系统,并进行各种操作(创建属于自己的一些记录);该管理系统中有一个超级管理员,其可以删除系统中所有被创建的用户。我的问题是:如果超级管理员把其中的一个用户账号删除掉了,那么应该对该被删除用户所创建的记录进行怎么样的处理(由于用于存放用户信息的表不可能和系统中所有表进行级联删除操作)?因为这样的原因所以系统的数据库中就会存在一些被删用户留下的记录。我的处理方法:1.用数据库的job定时对系统中被删用户留下的记录进行删除操作。
2.用java程序屏蔽掉那些已经没有创建人的记录(即:通过查询语句,屏蔽掉那些被删用户留下的记录),但这样数据库中留下的脏数据将会慢慢增加。大家有什么好的建议吗???谢谢!

解决方案 »

  1.   

    一般不建议把业务数据直接delete掉,其实你可以建这种类似于备份的表,表结构完全一样。然后用job定时把这些已删除用户的数据转移过去。这样,既减少了实际业务表的数据量以提高查询速度(你的方法二用屏蔽的方法更不可取,脏数据太多会严重影响性能。),又可以在必要的时候(比如admin误删除了某用户而过了一段时间才发现,又需要把已删除的业务数据找回来。),进行数据的恢复。在确定的时候,才对那些备份删除数据的表的数据进行删除。
    另外,从业务角度来讲,一般比较重要的业务数据进行删除的时候,代码里面应该控制进行逻辑删除(打删除标记)而不是物理删除(直接delete)。个人意见哈,仅供参考。
      

  2.   

    漏了一点,方法二里面的java屏蔽也是必要的,要不会出现脏数据。我的意思是光做java屏蔽是不够的。呵呵,好像我废话比较多。。
      

  3.   

    这样是不行的
    C:\Documents and Settings\Admin>sqlplus scott/tigerSQL*Plus: Release 10.2.0.1.0 - Production on Thu Dec 10 11:59:05 2009Copyright (c) 1982, 2005, Oracle.  All rights reserved.
    Connected to:
    Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
    With the Partitioning, OLAP and Data Mining optionsSQL> create user u1 identified by u1;User created.SQL> select * from t1;        ID NAME
    ---------- ----------
             1 whSQL> grant all on t1 to u1;Grant succeeded.SQL> conn / as sysdba
    Connected.
    SQL> grant connect to u1;Grant succeeded.SQL> conn u1/u1
    Connected.
    SQL> select * from scott.t1;        ID NAME
    ---------- ----------
             1 whSQL> insert into scott.t1 values(2,'wp');1 row created.SQL> commit;Commit complete.SQL> select * from scott.t1;        ID NAME
    ---------- ----------
             2 wp
             1 whSQL> conn scott/tiger
    Connected.
    SQL> drop user u1 cascade;User dropped.SQL> select * from t1;        ID NAME
    ---------- ----------
             2 wp              --这条数据还在
             1 whSQL>
      

  4.   

    但我发现如果删除的话,涉及的表如果很多的话,还得整个job什么的东西定期自动删除系统中所有被删除用户创建的记录很麻烦,还不如停用用户好,并且这样的话客户还可以看见历史用户记录信息。