2012-05-09 9 views
-1

小さな事前登録データベースでは、特定のユーザー名が指定されるたびにVIEWを生成するために、次のSQLを使用しています。私は主に、sysadminが重複する名前が登録されていると思われるたびにスナップショットを取得するためにこれを使用しています。これはまれにしか実行されません(1時間に1回atmost)ので、データベースのスキーマが過度に大きくなるべきではありません。場合によっては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

このトリガーは正確に何をすべきですか?ビューには、ユーザー名を含む1つの行を含むビューが再定義されているようです。何か不足していますか? – therealmitchconnors

+0

@therealmitchconnorsああ、私はクエリ文字列をミスコピーしたようだ。そこに複数の行を取得するsys_refcursorがあるはずです。ビューは、どのユーザが複数の登録をしているかを確認するだけです。申し訳ありませんが、コードを更新する必要があります。 – RaunakS

答えて

4

に複数の行ですべてのメンバーを返します。

1.)ビューは、基本的にはストアドされたSQL文であり、格納されたSQL結果ではないため、ビューは常にビューを照会する時点でデータを表示します。

2.)アプリケーションの通常の処理中にDDL(create statement)などを使用することは決してありません。データベースが動作する方法だけではありません。

特定の時点でスナップショットを作成する場合は、元のテーブルのすべての列にスナップショットのタイムスタンプを加えたセカンダリテーブルを作成します。

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

+0

私はあなたの最初のポイントを得ていない、あなたは明確にすることができますか?そして、私は多分、ビューを多数作成すると、重複するテーブルを作成するよりもオーバーヘッドが少なくなると思います。私はそこに間違っていた? – RaunakS

+1

ビューから選択すると、ビュー内のselectステートメントがその時点で実行されるため、ビューは目的に合っていません。マテリアライズド・ビューを使用できますが、パフォーマンスの問題が発生している場合を除いてはいけません –

1

ここでも、「私は何をしようとしています」自問してみてください?

技術に集中しないでください。あなたの目標が何であるかを明確にした後でそれを行います。

データベースに登録が重複しないようにする場合は、ユーザーテーブルが検索され、そのユーザー名が既に存在する場合はエラーが表示されます。

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

+0

私はあなたが何を言おうとしているのか理解しています。しかし、重複登録を避けるだけではありません。重複登録が行われたときと誰のスナップショットを保持しようとしています。私の実装は台無しだと認めます。 – RaunakS

+0

次に、「REGISTRATION_LOG」のようなテーブルを作成し、そこにすべての登録を保存します。次に、そのテーブルのクエリで重複登録を簡単に見つけることができます。しかし、なぜあなたのサイトに重複した登録をしたいのだろうか? –

+0

明らかに、私が望むのは、管理者が望むたびにスナップショットを保持することです。これは、その時点で登録されている重複数と重複数を明確に示します。これはあまり知られていないセキュリティ目的のためのものです。 – RaunakS

2

あなたのコメントをもとに、あなたが望むように、それはこの

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

のようなものに聞こえるこれは、ここにいくつかの誤解があるように思われるテーブル

+0

これは便利です、ありがとうございます。しかし、私は実際にスナップショットの時に_all_メンバーを望んでいます - 正当なものも含めて、 'COUNT(*)'関数は必要ありません。 – RaunakS

+0

私はまだあなたが求めていることを理解していない...あなたは重複したメンバーのリストがほしいと思った?今、あなたはすべてのメンバーのリストが必要ですか?テーブルは何ですか?あなたは本当にトリガーでビューを定義するのを避けるべきです... – therealmitchconnors

+0

私は何をしようとしているのか説明できません、ごめんなさい:「SysAdmin Dup Tester」という名前が入力されたときはいつでも、私にメンバーの名前と重複の数(もしあれば)を教えてください。私はその質問に編集する必要がありますか? – RaunakS

関連する問題