2012-05-09 1 views
-1

В небольшой базе данных предварительной регистрации я использую следующий SQL для создания VIEW всякий раз, когда указывается конкретное имя пользователя. Я использую это в основном для получения моментального снимка всякий раз, когда системный администратор подозревает, что повторяющиеся имена регистрируются. Это будет сделано редко (максимум один раз в час), поэтому схема базы данных не должна становиться чрезмерно большой.Как эффективно создавать TRIGGER, который иногда генерирует 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

Что именно должен делать этот триггер? Похоже, он просто переопределяет представление, чтобы в нем содержалась одна строка, содержащая имя пользователя. Я что-то упускаю? – therealmitchconnors

+0

@therealmitchconnors Aargh, кажется, я не читал строку запроса. Предполагалось, что там будет sys_refcursor, чтобы получить несколько строк. В представлении будет просто проверено, какие пользователи имеют несколько регистраций. Извините, мне пришлось обновить код. – RaunakS

ответ

4

Там, кажется, что некоторые недоразумения здесь.

1.) Представления представляют собой в основном хранимые операторы sql, а не сохраненные sql-результаты, поэтому ваш вид всегда будет отображать данные так, как они находятся в точке запроса.

2.) Никогда не используйте DDL (создавать заявления) и т.п. при нормальной обработке приложения. Это просто не то, как базы данных предназначены для работы.

Если вы хотите моментальный снимок в определенный момент времени, создайте дополнительную таблицу, которая содержит все столбцы исходной таблицы, а также отметку времени моментального снимка.

Когда вы хотите сделать снимок, скопируйте все нужные данные из исходной таблицы в таблицу моментальных снимков при добавлении текущей метки времени.

+0

Я не получил ваш первый момент, не могли бы вы уточнить? И я ожидал, возможно, наивно, что создание множества представлений будет иметь меньшие накладные расходы, чем создание повторяющихся таблиц. Тогда я был неправ? – RaunakS

+1

Если вы выберете из представления, оператор выбора внутри представления будет выполнен в тот момент, поэтому представления просто не подходят для вашей цели. Вы можете использовать материализованные представления, но не следует, если у вас есть проблемы с производительностью –

1

Опять же, спросите себя: «Что я хочу сделать»?

Не сосредотачивайтесь на технологии. Сделайте это после того, как у вас есть четкое представление о вашей цели.

Если вы просто пытаетесь избежать дублирования регистраций в своей базе данных, просто найдите таблицу пользователей и покажите сообщение об ошибке, если это имя пользователя уже существует.

Кроме того, подумайте о своих данных, прежде чем вдаваться в детали реализации.

+0

Я понимаю, что вы пытаетесь сказать. Но я не просто избегаю повторной регистрации: я пытаюсь сохранить моментальный снимок того, кто и когда были сделаны повторные регистрации. Я признаю, что моя реализация испорчена. – RaunakS

+0

Затем создайте таблицу типа «REGISTRATION_LOG» и сохраните там все записи. Затем вы можете легко найти дубликаты регистраций с запросом в этой таблице. Но я удивляюсь, почему * вы хотите дублировать регистрацию на своем сайте ... –

+0

Я не уверен, что я хочу, чтобы сохранить моментальный снимок, когда захочет администратор, что ясно показывает, сколько дубликатов и не дубликатов было зарегистрировано в то время. Это для какой-то неясной цели безопасности, причина которой мне неизвестна. – RaunakS

2

Основываясь на ваш комментарий, это звучит, как вы хотите что-то вроде этого

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

Это будет возвращать все члены с более чем одной строки в таблице

+0

Это полезно, спасибо. Но на самом деле я хочу, чтобы во время моментального снимка были _все_ члены, в том числе и законные, поэтому функция 'COUNT (*)' не нужна. – RaunakS

+0

Я все еще не понимаю, о чем вы спрашиваете ... Я думал, что вам нужен список дублирующих членов? Теперь вам нужен список всех участников? Разве это не та таблица? Вы действительно должны избегать определения представления в триггере ... – therealmitchconnors

+0

Извините, я не могу объяснить, что я пытаюсь сделать: всякий раз, когда вводится имя 'SysAdmin Dup Tester', я хочу создать представление, которое покажите мне имя участника и номер дубликата (если есть). Должен ли я изменить это на вопрос? – RaunakS

Смежные вопросы