-1

在一个小型预注册数据库上,只要给出特定用户名,我就使用以下 SQL 生成一个 VIEW。每当系统管理员怀疑重复名称正在注册时,我主要使用它来获取快照。这将很少进行(最多每小时一次),因此数据库模式不应该变得过大。

CREATE OR REPLACE TRIGGER upd_on_su_entry
    AFTER UPDATE OR INSERT
    ON PRE_REG_MEMBER
    FOR EACH ROW
BEGIN
    IF :new.MEMBER_NAME  = 'SysAdmin Dup Tester' THEN
        EXECUTE IMMEDIATE 'CREATE OR REPLACE VIEW mem_n AS SELECT :old.MEMBER_NAME, COUNT(:old.MEMBER_NAME) FROM MEMBER GROUP BY MEMBER_NAME';
    END IF;
END;

然而,这似乎是一种臃肿、低效和错误的工作方式(根据我的管理员)。这里有根本错误吗?我可以通过其他方式拍摄等效快照吗?

我对 SQL 很陌生,所以请多多包涵。

另外,我想将视图用作:

public void dups()throws Exception
{
    Calendar cal = Calendar.getInstance();
    jt.setText("Duplicate List at : "+ cal.getTime());
    try{
        rs=stat.executeQuery("select * from upd_on_su_entry");
        while(rs.next())
        {
            jt.append(rs.getString("MEMBER_NAME")+"\t");
            jt.append(rs.getString(2)+"\t");
        }
    }
    catch(Exception e){System.out.print("\n"+e);}
}
4

3 回答 3

4

这里似乎有一些误解。

1.) 视图基本上是存储的 sql 语句,而不是存储的 sql 结果,因此您的视图将始终显示查询视图时的数据。

2.) 在应用程序的正常处理过程中,永远不要使用 DDL(创建语句)和类似的东西。它只是不是数据库的工作方式。

如果您想要某个时间点的快照,请创建一个辅助表,其中包含原始表的所有列以及快照时间戳。

当您想要制作快照时,将原始表中所需的所有数据复制到快照表中,同时添加当前时间戳。

于 2012-05-09T19:37:40.707 回答
2

根据您的评论,听起来您想要这样的东西

SELECT MEMBER_NAME FROM PRE_REG_MEMBER
GROUP BY MEMBER_NAME HAVING COUNT(*) > 1;

这将返回表格中超过一行的所有成员

于 2012-05-09T19:13:52.820 回答
1

再次问自己“我想做什么”?

不要专注于技术。在你清楚地知道你的目标是什么之后再做这件事。

如果您只是想避免在数据库上重复注册,只需搜索用户表并在该用户名已经存在时显示错误。

此外,在进入实现细节之前,请仔细考虑您的数据模型。

于 2012-05-09T19:11:55.200 回答