powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Триггер на удаление
25 сообщений из 29, страница 1 из 2
Триггер на удаление
    #39613638
Фотография Goofy122
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Срабатывает триггер на DML, и инсертится измененная инфа на новую созданную таблицу.

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

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

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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;
/



Заранее спасибо !
...
Рейтинг: 0 / 0
Триггер на удаление
    #39613639
Фотография Goofy122
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я извиняюсь удалялись 1-ые 5000 добавленные и оставались последние 5000
...
Рейтинг: 0 / 0
Триггер на удаление
    #39613692
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Goofy122,

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

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

.....
stax
...
Рейтинг: 0 / 0
Триггер на удаление
    #39613727
Фотография Viewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обычно критерием является срок хранения, а не количество записей (или баланс между количество и сроком, но срок хранения всё равно остаётся планкой).
Imho, но попробуйте рассмотреть этот вариант, тем более, что его легко реализовать непосрественно в триггере.
Но если уж никак, то тогда вариант Stax-a - интервальный джоб (count при каждой вставке в триггере довольно дорогое удовольствие, тем более что удалять придётся, кроме условия count, всё равно с учётом insert_time)
...
Рейтинг: 0 / 0
Триггер на удаление
    #39613764
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Goofy122,

create sequence start with 1 maxvalue 5000 cycle;
...
Рейтинг: 0 / 0
Триггер на удаление
    #39613768
Фотография Viewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-Goofy122,

create sequence start with 1 maxvalue 5000 cycle;
однако... мне это нравится..очень.. Дёшево и сердито
...
Рейтинг: 0 / 0
Триггер на удаление
    #39613802
Фотография Goofy122
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо , решил таким путем ROWID <= 1 даже не пробовал применять при удалении , но он действует и удаляет самый 1-ую добавленную строку , при превышении планки 5000 он будет оставлять самые последние 5000 значений и тем самым строк в таблице будет не больше 5000

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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;
/
...
Рейтинг: 0 / 0
Триггер на удаление
    #39613817
Фотография Viewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Goofy122,
"ROWID <= 1 .... удаляет самый 1-ую добавленную строку" - совпадение и самообман

Рассмотрите предложение -2- . Суррогатный ключ, на основе которого строится остальная логика...
...
Рейтинг: 0 / 0
Триггер на удаление
    #39613875
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViewerРассмотрите предложение -2- . Суррогатный ключ, на основе которого строится остальная логика...Интересно было бы взглянуть на дальнейшую логику
...
Рейтинг: 0 / 0
Триггер на удаление
    #39613877
Фотография Viewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровViewerРассмотрите предложение -2- . Суррогатный ключ, на основе которого строится остальная логика...Интересно было бы взглянуть на дальнейшую логику
-2-Goofy122,

create sequence start with 1 maxvalue 5000 cycle;
Ключ генерится по кругу и новая запись заменяет существующую с таким же ключём.
Если я ошибся, и уважаемый -2- имел ввиду несколько иное, прошу поправить.
...
Рейтинг: 0 / 0
Триггер на удаление
    #39613881
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудровдальнейшую логику
x := seq.nextval;
merge ... using (select x, ... from dual) ...
...
Рейтинг: 0 / 0
Триггер на удаление
    #39613930
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viewer-2-Goofy122,

create sequence start with 1 maxvalue 5000 cycle;
однако... мне это нравится..очень.. Дёшево и сердито

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

.....
stax
...
Рейтинг: 0 / 0
Триггер на удаление
    #39613935
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Goofy122Спасибо , решил таким путем ROWID <= 1 даже не пробовал применять при удалении , но он действует и удаляет самый 1-ую добавленную строку , при превышении планки 5000 он будет оставлять самые последние 5000 значений и тем самым строк в таблице будет не больше 5000

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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 "последних")
имхо, так делать нельзя

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
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
...
Рейтинг: 0 / 0
Триггер на удаление
    #39613943
Фотография Viewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав,
у меня создалось впечатление, что у вас не отрефрешилась страничка с топиком и вы не видели 2 поста перед вашими..
...
Рейтинг: 0 / 0
Триггер на удаление
    #39613973
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViewerСтанислав,
у меня создалось впечатление, что у вас не отрефрешилась страничка с топиком и вы не видели 2 поста перед вашими..

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

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

а задача

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

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

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

.....
stax
...
Рейтинг: 0 / 0
Триггер на удаление
    #39614016
Фотография Viewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Брат наш Goofy,
поясните пожалуйста выражение "на новую созданную таблицу", или это просто "фигура речи"?
...
Рейтинг: 0 / 0
Триггер на удаление
    #39614063
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудровпропущено...
Интересно было бы взглянуть на дальнейшую логику
-2-Goofy122,

create sequence start with 1 maxvalue 5000 cycle;
Ключ генерится по кругу и новая запись заменяет существующую с таким же ключём.
Если я ошибся, и уважаемый -2- имел ввиду несколько иное, прошу поправить.[/quot]-2-Вячеслав Любомудровдальнейшую логику
x := seq.nextval;
merge ... using (select x, ... from dual) ...Т.е. предлагается менять саму процедуру вставки?
Как насчет пропущенных значений в последовательности? (откат или вылет из кеша)
Чем это лучше чем просто значение из безразмерной последовательности или таймстампа (default) и периодической поддиркой?
...
Рейтинг: 0 / 0
Триггер на удаление
    #39614076
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровТ.е. предлагается менять саму процедуру вставки?
Как насчет пропущенных значений в последовательности? (откат или вылет из кеша)
Чем это лучше чем просто значение из безразмерной последовательности или таймстампа (default) и периодической поддиркой?

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

.....
stax
...
Рейтинг: 0 / 0
Триггер на удаление
    #39614100
Фотография Viewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Условие было хранить не более 10 000 записей, и единовременно удалять 5 000 при достижении порога.
Т.е. количество актуальных записей аудита колеблется от 5 000 до 10 000.
Имеем возможность держать практически 10 000 актуальных записей аудита постоянно (при sequence с maxvalue 10000 cycle).
Возможное количество пропущенных значения последовательности, imho, явно значительно меньше 5000, т.е. актуальных записей аудита, за вычетом перестарков, будет практически в 2 раза больше, с редкими колебаниями от верхней границы на незначительные и допустимые величины.
...
Рейтинг: 0 / 0
Триггер на удаление
    #39614107
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViewerУсловие было хранить не более 10 000 записей, и единовременно удалять 5 000 при достижении порога.
Т.е. количество актуальных записей аудита колеблется от 5 000 до 10 000.
Имеем возможность держать практически 10 000 актуальных записей аудита постоянно (при sequence с maxvalue 10000 cycle).
Возможное количество пропущенных значения последовательности, imho, явно значительно меньше 5000, т.е. актуальных записей аудита, за вычетом перестарков, будет практически в 2 раза больше, с редкими колебаниями от верхней границы на незначительные и допустимые величины.
постановка для меня несколько туманная
в таблице 10000 записей, вставляется 3 записи
кто удалит 5003 старых?

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

....
stax
...
Рейтинг: 0 / 0
Триггер на удаление
    #39614117
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StaxВячеслав ЛюбомудровТ.е. предлагается менять саму процедуру вставки?
Как насчет пропущенных значений в последовательности? (откат или вылет из кеша)
Чем это лучше чем просто значение из безразмерной последовательности или таймстампа (default) и периодической поддиркой?

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

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

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

Если меняется сам процесс вставки -- то, собственно, все те же вопросы остаются, только у нас тут разнообразие типа MERGE, UPDATE, но в multiuser оно один фиг -- либо сериализация (если ключ из последовательности уникальный, либо куча дублей)
...
Рейтинг: 0 / 0
Триггер на удаление
    #39614121
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудровв multiuser оно один фиг -- либо сериализация (если ключ из последовательности уникальный, либо куча дублей)Последовательности разве не глобальны (внетранзакционны)?
...
Рейтинг: 0 / 0
Триггер на удаление
    #39614127
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, мы же говорим про циклическую последовательность
Если она вставляется в уникальное поле -- будет точка сериализации, если последовательность провернется
...
Рейтинг: 0 / 0
Триггер на удаление
    #39614130
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровЕсли она вставляется в уникальное поле -- будет точка сериализации, если последовательность провернется... и merge сделает update, если не будет других мешающих факторов.
Ну т.е. проблемы, наверное, будут, но вряд ли эти проблемы будут напрямую связаны с цикличностью последовательности.
...
Рейтинг: 0 / 0
Триггер на удаление
    #39614134
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovВячеслав ЛюбомудровЕсли она вставляется в уникальное поле -- будет точка сериализации, если последовательность провернется... и merge сделает update, если не будет других мешающих факторов.
Ну т.е. проблемы, наверное, будут, но вряд ли эти проблемы будут напрямую связаны с цикличностью последовательности.Имеется ввиду что вставляют разные сессии большие пачки одновременно
Возможно, все надуманно

но к чему это все, когда есть простое решение?
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Триггер на удаление
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]