powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Триггер, не позволяющий обновить больше n-строк
13 сообщений из 38, страница 2 из 2
Триггер, не позволяющий обновить больше 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
13 сообщений из 38, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Триггер, не позволяющий обновить больше n-строк
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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