Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Триггер на удаление  [new]
Goofy122
Member

Откуда:
Сообщений: 198
Срабатывает триггер на DML, и инсертится измененная инфа на новую созданную таблицу.

Нужно чтобы в таблицы сохранялось инфа не больше count= 10000 например если превысилось количество , срабатывает еще один триггер и удаляет инду

Вот только как удалить последние 5000 добавленные стоблцы ?

CREATE OR REPLACE TRIGGER AUDIT_TRIGGER_NAME  BEFORE  INSERT  ON AUDIT_TABLE_LOGS   
ENABLE
DECLARE 
V_COUNT NUMBER;

    BEGIN
    
    SELECT COUNT(*) INTO V_COUNT FROM AUDIT_TABLE_LOGS   ; 
    
     IF V_COUNT  > 10000 THEN
     
         DELETE FROM AUDIT_TABLE_LOGS  WHERE ROWID <= 5000;
          
     END IF;

  END;
/


Заранее спасибо !
12 мар 18, 17:06    [21250473]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на удаление  [new]
Goofy122
Member

Откуда:
Сообщений: 198
я извиняюсь удалялись 1-ые 5000 добавленные и оставались последние 5000
12 мар 18, 17:10    [21250483]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на удаление  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1108
Goofy122,

в триггере сложно (придется перейти почти в однопользовательский режим)

удаляйте лишнее, напр, каждый час

.....
stax
12 мар 18, 18:00    [21250694]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на удаление  [new]
Viewer
Member

Откуда: Самара
Сообщений: 5190
Обычно критерием является срок хранения, а не количество записей (или баланс между количество и сроком, но срок хранения всё равно остаётся планкой).
Imho, но попробуйте рассмотреть этот вариант, тем более, что его легко реализовать непосрественно в триггере.
Но если уж никак, то тогда вариант Stax-a - интервальный джоб (count при каждой вставке в триггере довольно дорогое удовольствие, тем более что удалять придётся, кроме условия count, всё равно с учётом insert_time)
12 мар 18, 18:51    [21250845]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на удаление  [new]
-2-
Member

Откуда:
Сообщений: 13578
Goofy122,

create sequence start with 1 maxvalue 5000 cycle;
12 мар 18, 20:16    [21250988]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на удаление  [new]
Viewer
Member

Откуда: Самара
Сообщений: 5190
-2-
Goofy122,

create sequence start with 1 maxvalue 5000 cycle;

однако... мне это нравится..очень.. Дёшево и сердито
12 мар 18, 20:34    [21251027]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на удаление  [new]
Goofy122
Member

Откуда:
Сообщений: 198
Спасибо , решил таким путем ROWID <= 1 даже не пробовал применять при удалении , но он действует и удаляет самый 1-ую добавленную строку , при превышении планки 5000 он будет оставлять самые последние 5000 значений и тем самым строк в таблице будет не больше 5000

CREATE OR REPLACE TRIGGER AUDIT_TRIGGER_NAME  BEFORE  INSERT  ON AUDIT_TABLE_LOGS   
ENABLE
DECLARE 
V_COUNT NUMBER;

    BEGIN
    
    SELECT COUNT(*) INTO V_COUNT FROM AUDIT_TABLE_LOGS   ; 
    
     IF V_COUNT  >= 5000 THEN
     
         DELETE FROM AUDIT_TABLE_LOGS  WHERE ROWID <= 1 ;
          
     END IF;

  END;
/
12 мар 18, 21:59    [21251227]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на удаление  [new]
Viewer
Member

Откуда: Самара
Сообщений: 5190
Goofy122,
"ROWID <= 1 .... удаляет самый 1-ую добавленную строку" - совпадение и самообман

Рассмотрите предложение -2- . Суррогатный ключ, на основе которого строится остальная логика...
12 мар 18, 22:47    [21251305]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на удаление  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 17647
Viewer
Рассмотрите предложение -2- . Суррогатный ключ, на основе которого строится остальная логика...
Интересно было бы взглянуть на дальнейшую логику
13 мар 18, 07:23    [21251570]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на удаление  [new]
Viewer
Member

Откуда: Самара
Сообщений: 5190
Вячеслав Любомудров
Viewer
Рассмотрите предложение -2- . Суррогатный ключ, на основе которого строится остальная логика...
Интересно было бы взглянуть на дальнейшую логику

-2-
Goofy122,

create sequence start with 1 maxvalue 5000 cycle;

Ключ генерится по кругу и новая запись заменяет существующую с таким же ключём.
Если я ошибся, и уважаемый -2- имел ввиду несколько иное, прошу поправить.
13 мар 18, 07:42    [21251577]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на удаление  [new]
-2-
Member

Откуда:
Сообщений: 13578
Вячеслав Любомудров
дальнейшую логику

x := seq.nextval;
merge ... using (select x, ... from dual) ...
13 мар 18, 08:09    [21251591]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на удаление  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1108
Viewer
-2-
Goofy122,

create sequence start with 1 maxvalue 5000 cycle;

однако... мне это нравится..очень.. Дёшево и сердито


как оставлять последние?

.....
stax
13 мар 18, 09:49    [21251867]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на удаление  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1108
Goofy122
Спасибо , решил таким путем ROWID <= 1 даже не пробовал применять при удалении , но он действует и удаляет самый 1-ую добавленную строку , при превышении планки 5000 он будет оставлять самые последние 5000 значений и тем самым строк в таблице будет не больше 5000

CREATE OR REPLACE TRIGGER AUDIT_TRIGGER_NAME  BEFORE  INSERT  ON AUDIT_TABLE_LOGS   
ENABLE
DECLARE 
V_COUNT NUMBER;

    BEGIN
    
    SELECT COUNT(*) INTO V_COUNT FROM AUDIT_TABLE_LOGS   ; 
    
     IF V_COUNT  >= 5000 THEN
     
         DELETE FROM AUDIT_TABLE_LOGS  WHERE ROWID <= 1 ;
          
     END IF;

  END;
/


есть два философских вопроса
1) работа в многопользовательском режиме
2) что считать последним

шаблон удаления (оставить 10 "последних")
имхо, так делать нельзя

SQL> create table t10000 as select * from emp where 1=2;

Table created.

SQL> CREATE OR REPLACE TRIGGER ti_t10000
  2    FOR INSERT ON t10000
  3      COMPOUND TRIGGER
  4    BEFORE EACH ROW IS
  5    BEGIN
  6     :new.empno:=s.nextval;
  7    END BEFORE EACH ROW;
  8    AFTER STATEMENT IS
  9    BEGIN
 10      delete t10000 where empno<
 11        (select min(empno) from (select empno from t10000 order by empno desc) where rownum<=10);
 12    END AFTER STATEMENT;
 13  END;
 14  /

Trigger created.

SQL> insert into t10000 select * from emp where deptno=10;

3 rows created.

SQL> select count(*) from t10000;

  COUNT(*)
----------
         3

SQL> insert into t10000 select * from emp;

14 rows created.

SQL> select * from emp;

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17.12.80        800                    20
      7499 ALLEN      SALESMAN        7698 20.02.81       1600        300         30
      7521 WARD       SALESMAN        7698 22.02.81       1250        500         30
      7566 JONES      MANAGER         7839 02.04.81       2975                    20
      7654 MARTIN     SALESMAN        7698 28.09.81       1250       1400         30
      7698 BLAKE      MANAGER         7839 01.05.81       2850                    30
      7782 CLARK      MANAGER         7839 09.06.81       2450                    10
      7788 SCOTT      ANALYST         7566 09.12.82       3000                    20
      7839 KING       PRESIDENT            17.11.81       5000                    10
      7844 TURNER     SALESMAN        7698 08.09.81       1500                    30
      7876 ADAMS      CLERK           7788 12.01.83       1100                    20
      7900 JAMES      CLERK           7698 03.12.81        950                    30
      7902 FORD       ANALYST         7566 03.12.81       3000                    20
      7934 MILLER     CLERK           7782 23.01.82       1300                    10

14 rows selected.

SQL> select * from t10000;

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
       188 MARTIN     SALESMAN        7698 28.09.81       1250       1400         30
       189 BLAKE      MANAGER         7839 01.05.81       2850                    30
       190 CLARK      MANAGER         7839 09.06.81       2450                    10
       191 SCOTT      ANALYST         7566 09.12.82       3000                    20
       192 KING       PRESIDENT            17.11.81       5000                    10
       193 TURNER     SALESMAN        7698 08.09.81       1500                    30
       194 ADAMS      CLERK           7788 12.01.83       1100                    20
       195 JAMES      CLERK           7698 03.12.81        950                    30
       196 FORD       ANALYST         7566 03.12.81       3000                    20
       197 MILLER     CLERK           7782 23.01.82       1300                    10

10 rows selected.

SQL>


.....
stax
13 мар 18, 09:56    [21251898]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на удаление  [new]
Viewer
Member

Откуда: Самара
Сообщений: 5190
Станислав,
у меня создалось впечатление, что у вас не отрефрешилась страничка с топиком и вы не видели 2 поста перед вашими..
13 мар 18, 10:12    [21251941]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на удаление  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1108
Viewer
Станислав,
у меня создалось впечатление, что у вас не отрефрешилась страничка с топиком и вы не видели 2 поста перед вашими..


спасибо, посмотрел

но здесь решение (красивое) с заменой инсерт на мерже

а задача

автор
Срабатывает триггер на DML, и инсертится измененная инфа на новую созданную таблицу.


с помощую триггера, причем инсертится на новую созданную таблицу

имхо, на новую табличку мерже и циклическая последователтность не отработает

.....
stax
13 мар 18, 10:54    [21252116]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на удаление  [new]
Viewer
Member

Откуда: Самара
Сообщений: 5190
Брат наш Goofy,
поясните пожалуйста выражение "на новую созданную таблицу", или это просто "фигура речи"?
13 мар 18, 11:41    [21252310]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на удаление  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 17647
Вячеслав Любомудров
пропущено...
Интересно было бы взглянуть на дальнейшую логику

-2-
Goofy122,

create sequence start with 1 maxvalue 5000 cycle;

Ключ генерится по кругу и новая запись заменяет существующую с таким же ключём.
Если я ошибся, и уважаемый -2- имел ввиду несколько иное, прошу поправить.[/quot]
-2-
Вячеслав Любомудров
дальнейшую логику

x := seq.nextval;
merge ... using (select x, ... from dual) ...
Т.е. предлагается менять саму процедуру вставки?
Как насчет пропущенных значений в последовательности? (откат или вылет из кеша)
Чем это лучше чем просто значение из безразмерной последовательности или таймстампа (default) и периодической поддиркой?
13 мар 18, 12:53    [21252518]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на удаление  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1108
Вячеслав Любомудров
Т.е. предлагается менять саму процедуру вставки?
Как насчет пропущенных значений в последовательности? (откат или вылет из кеша)
Чем это лучше чем просто значение из безразмерной последовательности или таймстампа (default) и периодической поддиркой?


идея красивая (не надо улалять)
токо я навскидку не пойму как отработает, если вставляется за раз больше maxvalue

.....
stax
13 мар 18, 13:18    [21252579]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на удаление  [new]
Viewer
Member

Откуда: Самара
Сообщений: 5190
Условие было хранить не более 10 000 записей, и единовременно удалять 5 000 при достижении порога.
Т.е. количество актуальных записей аудита колеблется от 5 000 до 10 000.
Имеем возможность держать практически 10 000 актуальных записей аудита постоянно (при sequence с maxvalue 10000 cycle).
Возможное количество пропущенных значения последовательности, imho, явно значительно меньше 5000, т.е. актуальных записей аудита, за вычетом перестарков, будет практически в 2 раза больше, с редкими колебаниями от верхней границы на незначительные и допустимые величины.
13 мар 18, 13:46    [21252655]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на удаление  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1108
Viewer
Условие было хранить не более 10 000 записей, и единовременно удалять 5 000 при достижении порога.
Т.е. количество актуальных записей аудита колеблется от 5 000 до 10 000.
Имеем возможность держать практически 10 000 актуальных записей аудита постоянно (при sequence с maxvalue 10000 cycle).
Возможное количество пропущенных значения последовательности, imho, явно значительно меньше 5000, т.е. актуальных записей аудита, за вычетом перестарков, будет практически в 2 раза больше, с редкими колебаниями от верхней границы на незначительные и допустимые величины.

постановка для меня несколько туманная
в таблице 10000 записей, вставляется 3 записи
кто удалит 5003 старых?

зы
триггером в "однопользовательском" режиме запросто

....
stax
13 мар 18, 13:55    [21252694]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на удаление  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 17647
Stax
Вячеслав Любомудров
Т.е. предлагается менять саму процедуру вставки?
Как насчет пропущенных значений в последовательности? (откат или вылет из кеша)
Чем это лучше чем просто значение из безразмерной последовательности или таймстампа (default) и периодической поддиркой?


идея красивая (не надо улалять)
токо я навскидку не пойму как отработает, если вставляется за раз больше maxvalue

.....
stax
Да я не спорю, идея красивая, смелая и т.д.
Вопрос, что дальше с этой красотой делать
Мне правда интересно -- люблю красивые решения

Я тут даже сначала подумал, что это предлагается в триггере -- циклическая последовательность до 10000, как только последовательность равна 5000 -- удаляем все с номерами 5001-10000, как только 10000 -- удаляем с номерами 1-5000. Но это for each rows (slow), непонятно, что делать при пропуске значения последовательности. Если не for each rows -- обработка существенно сложней особенно при одновременной вставке. И действительно непонятно что делать, когда несколько сессий вставляют пачками (да еще и по 5000 штук)...
Как известно, триггерные решения в многопользовательской работе слабо помогают

Если меняется сам процесс вставки -- то, собственно, все те же вопросы остаются, только у нас тут разнообразие типа MERGE, UPDATE, но в multiuser оно один фиг -- либо сериализация (если ключ из последовательности уникальный, либо куча дублей)
13 мар 18, 14:07    [21252738]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на удаление  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 8570
Вячеслав Любомудров
в multiuser оно один фиг -- либо сериализация (если ключ из последовательности уникальный, либо куча дублей)
Последовательности разве не глобальны (внетранзакционны)?
13 мар 18, 14:11    [21252750]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на удаление  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 17647
Ну, мы же говорим про циклическую последовательность
Если она вставляется в уникальное поле -- будет точка сериализации, если последовательность провернется
13 мар 18, 14:15    [21252763]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на удаление  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 8570
Вячеслав Любомудров
Если она вставляется в уникальное поле -- будет точка сериализации, если последовательность провернется
... и merge сделает update, если не будет других мешающих факторов.
Ну т.е. проблемы, наверное, будут, но вряд ли эти проблемы будут напрямую связаны с цикличностью последовательности.
13 мар 18, 14:18    [21252771]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на удаление  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 17647
Basil A. Sidorov
Вячеслав Любомудров
Если она вставляется в уникальное поле -- будет точка сериализации, если последовательность провернется
... и merge сделает update, если не будет других мешающих факторов.
Ну т.е. проблемы, наверное, будут, но вряд ли эти проблемы будут напрямую связаны с цикличностью последовательности.
Имеется ввиду что вставляют разные сессии большие пачки одновременно
Возможно, все надуманно

но к чему это все, когда есть простое решение?
13 мар 18, 14:21    [21252782]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить