如何有效地创建TRIGGER,有时会生成VIEW?

时间:2012-05-09 19:04:19

标签: sql jdbc triggers oracle10g

在一个小的预注册数据库上,每当给出特定的用户名时,我都会使用以下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);}
}

3 个答案:

答案 0 :(得分:4)

这里似乎有一些误解。

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

2.)在正常处理应用程序期间,永远不要使用DDL(创建语句)等。它不是数据库的工作方式。

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

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

答案 1 :(得分:2)

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

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

这将返回表中包含多行的所有成员

答案 2 :(得分:1)

再次问问自己"我想做什么"?

不要专注于技术。在明确了解目标之后再这样做。

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

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