在一个小的预注册数据库上,每当给出特定的用户名时,我都会使用以下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);}
}
答案 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)
再次问问自己"我想做什么"?
不要专注于技术。在明确了解目标之后再这样做。
如果您只是想避免在数据库上重复注册,只需搜索用户表并在该用户名已经存在时显示错误。
另外,在进入实现细节之前,请仔细考虑您的数据模型。