powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Триггер, не позволяющий обновить больше n-строк
38 сообщений из 38, показаны все 2 страниц
Триггер, не позволяющий обновить больше n-строк
    #39290420
gospodin_vasyaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день,
Есть потребность обезопасить одну важную таблицу от глобальных апдейтов, каждый отдельный апдейт должен быть не более 3 строк.
Как должен выглядеть триггер под эту задачу?
Большое спасибо!
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39290424
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gospodin_vasyaa,

ну делаешь временную табличку on commit delete rows. В ней счетчик.
По update before each row. Увеличиваешь счетчик. Вышел за границы разумного - дели на 0. :)
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39290434
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gospodin_vasyaa,

Студент?
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39290442
gospodin_vasyaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Арсеньев,
Если честно я не понял:
1) вне триггера создаем GLOBAL TEMPORARY TABLE
2) какой счетчик надо создать для этой таблицы?
3) как выгружать туда запрос по которому сработал триггер?
4) как не разрешать выполнить действие в теле триггера?
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39290443
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньевну делаешь временную табличку on commit delete rows. В ней счетчик.
По update before each row. Увеличиваешь счетчик. Вышел за границы разумного - дели на 0. :)Это вы так шутите?
Нафиг создавать таблички, если можно обойтись COMPOUND-триггером?
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39290444
gospodin_vasyaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexFF__|,
Нет, начинающий PL/SQL разработчик
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39290450
test__user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gospodin_vasyaa,

sql%rowcount > 3
rollback
?
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39290451
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gospodin_vasyaaAlexFF__|,
Нет, начинающий PL/SQL разработчик
Ну так учись описывать свои замыслы правильно.
2 быстрых update по 2 строки считаются update 4 строк? А 100 по 1 строке?
Какую цель в итоге хочешь достичь?
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39290452
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gospodin_vasyaaНет, начинающий PL/SQL разработчик

Тогда в ON EACH ROW триггере делай SELECT из этой самой таблицы. Гарантировано ограничение
в одну изменённою запись.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39290465
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gospodin_vasyaaДобрый день,
Есть потребность обезопасить одну важную таблицу от глобальных апдейтов, каждый отдельный апдейт должен быть не более 3 строк.
Как должен выглядеть триггер под эту задачу?
Большое спасибо!
для начала, раскройте тайну
апдейт не больше 3-х строк,
а мерж? (можно и и по ветвям - типа, "не больше ляля в when matched кляузе"
хотя и это баян

ну и постановщику этой дичины пламенный привет
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39290473
gospodin_vasyaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexFF__|,
Цель: не позволять работникам за один запрос апдейтить сразу много строк ( часто забывают условия where).
Если они подряд делают 100 апдейтов по одной строке, то пожалуйста. Еще раз: именно за раз не должно позволять обновлять много строк.
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39290479
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gospodin_vasyaaДобрый день,
Есть потребность обезопасить одну важную таблицу от глобальных апдейтов, каждый отдельный апдейт должен быть не более 3 строк.
Как должен выглядеть триггер под эту задачу?
Большое спасибо!

1) в before statment счетчік устанавливаете в 0
2) в after for each rows увеличиваете на 1
3) в after statment проверяете если счетчик больше 3-х срыв




зы
проще делать в компаунд триггере, но я их (компаунд тріггеров) боюсь из-за merge

.....
stax
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39290480
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gospodin_vasyaaAlexFF__|,
Цель: не позволять работникам за один запрос апдейтить сразу много строк ( часто забывают условия where)
Феерично )
Может тебе сделать процедуру для update/delete/insert таблицы, чтобы dml операции шли через нее?
И пусть "работники" пользуются ею.
Там сможешь реализовать и эту и остальные свои смелые фантазии по мере поступления.
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39290489
gospodin_vasyaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,
Мне кажется ваша реализация наиболее подходит, попробую реализовать, спасибо!
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39290501
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..я компаунд тріггеров боюсь из-за mergeможно подумать, обычные (не COMPOUND) вас спасут от этого
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39290503
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..но я их (компаунд тріггеров) боюсь из-за mergeА на чём основан страх?
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39290509
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elicstax..но я их (компаунд тріггеров) боюсь из-за mergeА на чём основан страх?
не понимаю как оно работает
выкладывал сдесь тест и вопросы по нему

.....
stax
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39290514
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--Это вы так шутите?
Нафиг создавать таблички, если можно обойтись COMPOUND-триггером?
1. Да.
2. Нафиг компаунд, когда можно через временную табличку? :)

Собственно компаунд это хорошо, пока нет merge, ну и если надо действительно действия на одну операцию. Табличка на транзакцию.
Собственно для понимая не важно.


Студент. Временная табличка (или переменная в компаунде) и есть счетчик. Собственно увеличиваем значение. Ну и про то, как не дать - я же сказал раздели на ноль. :)
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39290516
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicА на чём основан страх?
На том, что их два в одном. И причем третий вообще вызовется не инициализированным. :)
И главное это фича. :)
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39290523
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--stax..я компаунд тріггеров боюсь из-за mergeможно подумать, обычные (не COMPOUND) вас спасут от этого
не спасут, а спасают

.....
stax
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39290538
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..--Eugene--пропущено...
можно подумать, обычные (не COMPOUND) вас спасут от этого
не спасут, а спасают

.....
staxвозможно, с тех пор прошло немало времени, но всёже
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39290546
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gospodin_vasyaaЦель: не позволять работникам за один запрос апдейтить сразу много строк ( часто забывают условия where).Если на прод пускают разработчика, за которого нужно бояться, то нужны не триггера, а транквилизаторы. Сделай себе песочницу и ковыряйся в ней.
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39290654
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жаба тоадская тоже надоела
Только напишешь delete или update без where, сразу подчеркивает красной линией
Какое ей собачье дело, почему я where не написал или dual не приджойнил?
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39290655
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39291000
gospodin_vasyaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Арсеньев,
Спасибо, получилось вот так:


CREATE OR REPLACE TRIGGER tab1_str_upd
BEFORE UPDATE
ON tab1
FOR EACH ROW
declare
var1 number(2);
begin
insert into temp_table_in_sub (id) values ( 1);
select count(*) into var1 from temp_table_in_sub;
IF var1>5 THEN
raise_application_error( -20001, 'Нельзя одновременно обновлять столько строк!');
END IF;
END;
/
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39291012
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
5 раз по одной в одной транзакции уже попробовал?
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39291082
arlx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gospodin_vasyaa, можно через compound trigger

create table tab1 (id number, dd date, vv varchar2(32))
/
create or replace trigger tr_tab1
for update of dd,vv on tab1
compound trigger l_cnt number := 0;
after each row is
begin
l_cnt := l_cnt + 1;
if l_cnt > 3 then
raise_application_error(-20001, 'Нельзя одновременно обновлять столько строк!');
end if;
end after each row;
end tr_tab1;
/
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39291181
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arlxgospodin_vasyaa, можно через compound trigger

create table tab1 (id number, dd date, vv varchar2(32))
/
create or replace trigger tr_tab1
for update of dd,vv on tab1
compound trigger l_cnt number := 0;
after each row is
begin
l_cnt := l_cnt + 1;
if l_cnt > 3 then
raise_application_error(-20001, 'Нельзя одновременно обновлять столько строк!');
end if;
end after each row;
end tr_tab1;
/
проверте на мерже
напр
вставляет 2 строки меняет две строки и удаляет две строки

.....
stax
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39291191
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..проверте на мержетвоя мерджефобия не уступает многострокобоязни автора.
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39291213
arlx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,

но 2 же можно )
4 - нельзя.
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39291753
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-stax..проверте на мержетвоя мерджефобия не уступает многострокобоязни автора.
імхо
compound і мерже в 11-ке работают неправильно

.....
stax
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39291759
compadre.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..compound і мерже в 11-ке работают неправильнос мерджем, и не только с мерджем, могут "неправильно" срабатывать строчные триггеры независимо от их совмещения в compund или через переменную пакета.
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39291760
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arlxstax..,

но 2 же можно )
4 - нельзя.
авторSQL> select * from tab1;

ID DD VV
---------- -------- --------------------------------
1
2
3
4

SQL> merge into tab1 t using (
2 select 1 i,'u' o from dual union all
3 select 2 i,'u' o from dual union all
4 select 3 i,'d' o from dual union all
5 select 4 i,'d' o from dual union all
6 select 5 i,'i' o from dual union all
7 select 6 i,'i' o from dual
8 ) m
9 on (t.id=m.i)
10 WHEN MATCHED THEN UPDATE SET t.vv = m.o
11 DELETE WHERE (t.vv='d')
12 WHEN NOT MATCHED THEN INSERT (id,vv) values (m.i,m.o)
13 /
merge into tab1 t using (
*
ERROR at line 1:
ORA-20001: Нельзя одновременно обновлять столько строк!
ORA-06512: at "STAX.TR_TAB1", line 6
ORA-04088: error during execution of trigger 'STAX.TR_TAB1'



две обновлять можно

.....
stax
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39291764
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
compadre.с мерджем, и не только с мерджем, могут "неправильно" срабатывать строчные триггеры независимо от их совмещения в compund или через переменную пакета.
Ну как бы все зависит от понятия "не правильно". Compound предполагает методику free before use, как навеянный веками и единственно возможный вариант. В связи с чем есть подозрение, что там все написано по методу наоте..сь и совмещать merge и compound не стоит.
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39291768
arlx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,

stax..UPDATE SET t.vv = m.o
Но update же идет 4 записей.
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39291816
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arlxstax..,

stax..UPDATE SET t.vv = m.o
Но update же идет 4 записей.
двух
Код: 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.
SQL> alter trigger STAX.TR_TAB1 disable;

Trigger altered.

SQL> select * from tab1;

        ID DD       VV
---------- -------- --------------------------------
         1
         2
         3
         4

SQL> merge into tab1 t using (
  2  select 1 i,'u' o from dual union all
  3  select 2 i,'u' o from dual union all
  4  select 3 i,'d' o from dual union all
  5  select 4 i,'d' o from dual union all
  6  select 5 i,'i' o from dual union all
  7  select 6 i,'i' o from dual
  8  ) m
  9  on (t.id=m.i)
 10  WHEN MATCHED THEN UPDATE SET t.vv = m.o
 11      DELETE WHERE (t.vv='d')
 12  WHEN NOT MATCHED THEN INSERT (id,vv) values (m.i,m.o)
 13  /

6 rows merged.

SQL> select * from tab1;

        ID DD       VV
---------- -------- --------------------------------
         1          u
         2          u
         6          i
         5          i

SQL>



.....
stax
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39291848
arlx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,

сначала обновление 4 записей, потом удаление 2.

Код: sql
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.
create table tab1 (id number, dd date, vv varchar2(32))
/
create table log_tab1 (id number, ld date, la varchar2(1), lm varchar2(100), vv_old varchar2(32), vv_new varchar2(32))
/
create sequence log_tab1_seq
/
create or replace trigger tr_tab1_u
	for update of dd, vv on tab1
	compound trigger  
  l_cnt number := 0;
	-- AFTER EACH ROW Section:
	after each row is
	begin
		l_cnt := l_cnt + 1;
		--if l_cnt > 3 then
		--	raise_application_error(-20001, 'Нельзя одновременно обновлять столько строк!');
		--end if;
    insert into log_tab1(id, ld, la, lm, vv_old, vv_new)
    values (log_tab1_seq.nextval, :new.dd, 'u', 'обновление записи id =' ||to_char(:new.id)||' l_cnt = '||to_char(l_cnt), :old.vv, :new.vv);
	end after each row;
end;
/
create or replace trigger tr_tab1_d
	for delete on tab1
	compound trigger  l_cnt number := 0;
	-- AFTER EACH ROW Section:
	after each row is
	begin
		l_cnt := l_cnt + 1;
		--if l_cnt > 3 then
		--  raise_application_error(-20001, 'Нельзя одновременно обновлять столько строк!');
		--end if;
		insert into log_tab1
			(id, ld, la, lm, vv_old, vv_new)
		values
			(log_tab1_seq.nextval, :old.dd, 'd', 'удаление записи id =' || to_char(:new.id), :old.vv, null);
	end after each row;
end;
/
insert into tab1
	select level, sysdate, to_char(level) from dual connect by rownum <= 4
/  
merge into tab1 t using (
    select 1 i,'u' o from dual union all
    select 2 i,'u' o from dual union all
    select 3 i,'d' o from dual union all
    select 4 i,'d' o from dual union all
    select 5 i,'i' o from dual union all
    select 6 i,'i' o from dual
    ) m
on (t.id=m.i)
WHEN MATCHED THEN UPDATE SET t.vv = m.o
   DELETE WHERE (t.vv='d')
WHEN NOT MATCHED THEN INSERT (id,vv) values (m.i,m.o)
/
select * from log_tab1 order by id
/



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Table created
Table created
Sequence created
Trigger created
Trigger created
4 rows inserted
6 rows merged
        ID LD          LA LM                                                                               VV_OLD                           VV_NEW
---------- ----------- -- -------------------------------------------------------------------------------- -------------------------------- --------------------------------
         1 15.08.2016  u  обновление записи id =1 l_cnt = 1                                                1                                u
         2 15.08.2016  u  обновление записи id =2 l_cnt = 2                                                2                                u
         3 15.08.2016  u  обновление записи id =3 l_cnt = 3                                                3                                d
         4 15.08.2016  d  удаление записи id =                                                             d                                
         5 15.08.2016  u  обновление записи id =4 l_cnt = 4                                                4                                d
         6 15.08.2016  d  удаление записи id =                                                             d                                
6 rows selected
...
Рейтинг: 0 / 0
Триггер, не позволяющий обновить больше n-строк
    #39291870
arlx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,

то есть merge сначала update запись, потом обнаруживает что она попадает под условие delete, и удаляет ее.
Если триггер будет for update or delete , то счетчик еще раньше будет "генерить" ошибку
...
Рейтинг: 0 / 0
38 сообщений из 38, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Триггер, не позволяющий обновить больше n-строк
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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