-1

小さな事前登録データベースでは、次の SQL を使用して、特定のユーザー名が指定されるたびに VIEW を生成しています。私はこれを主に、システム管理者が重複した名前が登録されていると疑うたびにスナップショットを取得するために使用しています。これはめったに (1 時間に 1 回程度) 行われるため、データベース スキーマが過度に大きくなることはありません。

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(createステートメント)などを使用しないでください。これは、データベースが機能することを意図した方法ではありません。

ある時点でのスナップショットが必要な場合は、元のテーブルのすべての列とスナップショットのタイムスタンプを含むセカンダリテーブルを作成します。

スナップショットを作成する場合は、現在のタイムスタンプを追加しながら、必要なすべてのデータを元のテーブルからスナップショットテーブルにコピーします。

于 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

もう一度、「私は何をしようとしているのか」と自問してください。

技術に集中しないでください。あなたの目標が何であるかを明確に理解してから、それを行ってください。

データベースへの重複登録を避けたい場合は、users テーブルを検索して、そのユーザー名が既に存在する場合はエラーを表示します。

また、実装の詳細に入る前に、データモデルを慎重に検討してください。

于 2012-05-09T19:11:55.200 に答える