powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Триггеры... Поделитесь опытом
25 сообщений из 38, страница 1 из 2
Триггеры... Поделитесь опытом
    #34300512
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Необходимо при изменении данных в таблице автоматически обновлялись данные в других таблицах... Лучше делать все в одном триггере или разбивать на несколько? Поделитесь опытом....
...
Рейтинг: 0 / 0
Триггеры... Поделитесь опытом
    #34301106
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Триггеры никогда не могут быть UR???? Это ведь на самом деле так?
...
Рейтинг: 0 / 0
Триггеры... Поделитесь опытом
    #34301136
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как найти для процедуры пакет?
...
Рейтинг: 0 / 0
Триггеры... Поделитесь опытом
    #34301424
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TORTНеобходимо при изменении данных в таблице автоматически обновлялись данные в других таблицах... Лучше делать все в одном триггере или разбивать на несколько? Поделитесь опытом....Все равно.
TORTТриггеры никогда не могут быть UR???? Это ведь на самом деле так?Триггеры наследуют уровень изоляции вызывающего приложения.
Если надо его менять по ходу выполнения - используйте вызов процедуры из триггера.
TORTКак найти для процедуры пакет?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT
R.ROUTINESCHEMA, R.ROUTINENAME,
P.PKGSCHEMA, P.PKGNAME
, d.btype
FROM SYSCAT.ROUTINES R 
JOIN SYSCAT.ROUTINEDEP D 
ON  R.ROUTINESCHEMA = D.ROUTINESCHEMA
AND R.SPECIFICNAME  = D.ROUTINENAME 
JOIN SYSCAT.PACKAGES P
ON  D.BSCHEMA = P.PKGSCHEMA
AND D.BNAME   = P.PKGNAME;
...
Рейтинг: 0 / 0
Триггеры... Поделитесь опытом
    #34301426
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если есть 2 триггера на одинаковое событие, допустим after update... Какой триггер срабатывает первым?
В триггере использую оператор merge, так вот он вызывает блокировку всей таблицы, которую обновляю через merge... Возникают постоянные блокировки... Чего-то никак не могу разрулить....
Кто подскажет выход?
...
Рейтинг: 0 / 0
Триггеры... Поделитесь опытом
    #34301446
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Mark:
спасибо за информацию....
...
Рейтинг: 0 / 0
Триггеры... Поделитесь опытом
    #34301474
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TORTЕсли есть 2 триггера на одинаковое событие, допустим after update... Какой триггер срабатывает первым?Тот, который первым создан.
TORTВ триггере использую оператор merge, так вот он вызывает блокировку всей таблицы, которую обновляю через merge... Возникают постоянные блокировки... Чего-то никак не могу разрулить....
Кто подскажет выход?Покажите этот merge и ddl таблиц с индексами, которые там участвуют.
...
Рейтинг: 0 / 0
Триггеры... Поделитесь опытом
    #34301557
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот триггер:

CREATE TRIGGER DB2ADMIN.CHK_SALDO2
AFTER DELETE
ON DB2ADMIN.PROVOD REFERENCING OLD_TABLE as old
FOR EACH STATEMENT MODE DB2SQL
BEGIN atomic
merge into DB2ADMIN.saldo as a
using (select podrazd_id, debet_id, debet_partner_id, debet_analitika_id, sum(summa) as summa
from old group by podrazd_id, debet_id, debet_partner_id, debet_analitika_id) as b
on a.podrazd_id = b.podrazd_id
and a.subcount_id = b.debet_id
and a.partner_id = b.debet_partner_id
and a.analitika_id = b.debet_analitika_id
when matched then update set summa_debet = summa_debet - b.summa;

merge into DB2ADMIN.saldo as a
using (select podrazd_id, kredit_id, kredit_partner_id, kredit_analitika_id, sum(summa) as summa
from old group by podrazd_id, kredit_id, kredit_partner_id, kredit_analitika_id) as b
on a.podrazd_id = b.podrazd_id
and a.subcount_id = b.kredit_id
and a.partner_id = b.kredit_partner_id
and a.analitika_id = b.kredit_analitika_id
when matched then update set summa_kredit = summa_kredit - b.summa;

END

Вот такая таблица:
CREATE TABLE "DB2ADMIN"."SALDO" (
"PODRAZD_ID" BIGINT NOT NULL ,
"SUBCOUNT_ID" BIGINT NOT NULL ,
"PARTNER_ID" BIGINT NOT NULL ,
"ANALITIKA_ID" BIGINT NOT NULL ,
"SUMMA_DEBET" DECIMAL(20,2) NOT NULL ,
"SUMMA_KREDIT" DECIMAL(20,2) NOT NULL ,
"PODRAZD_PARTNER" BIGINT NOT NULL )
IN "DATA" INDEX IN "INDEX_8" ;
ALTER TABLE "DB2ADMIN"."SALDO" PCTFREE 20;

-- Операторы DDL для индексов таблицы "DB2ADMIN"."SALDO"

CREATE INDEX "DB2ADMIN"."IND1_SALDO" ON "DB2ADMIN"."SALDO"
("PODRAZD_PARTNER" ASC)
PCTFREE 10 MINPCTUSED 10
ALLOW REVERSE SCANS;

-- Операторы DDL для индексов таблицы "DB2ADMIN"."SALDO"

CREATE INDEX "DB2ADMIN"."IND2_SALDO" ON "DB2ADMIN"."SALDO"
("PARTNER_ID" ASC)
PCTFREE 10 MINPCTUSED 10

ALLOW REVERSE SCANS;


-- Операторы DDL для первичных ключей таблицы "DB2ADMIN"."SALDO"

ALTER TABLE "DB2ADMIN"."SALDO"
ADD CONSTRAINT "CC1166263937297" PRIMARY KEY
("PODRAZD_ID",
"SUBCOUNT_ID",
"PARTNER_ID",
"ANALITIKA_ID");

Вот так пытаюсь сделать....
...
Рейтинг: 0 / 0
Триггеры... Поделитесь опытом
    #34301688
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сделайте
runstats on table db2admin.saldo and indexes all
и покажите план запроса для этого merge.
Какой процент записей обновляется в db2admin.saldo при удалении из db2admin.provod?

И еще: вы не "ослабите" эксклюзивные блокировки уровнем изоляции UR:
Если вы изменили некоторую строку, то эксклюзивная блокировка этой строки останется до конца транзакции при любом уровне изоляции.
...
Рейтинг: 0 / 0
Триггеры... Поделитесь опытом
    #34301713
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так строка - это ничего страшного... Зачем же блокируется целая таблица? Я увеличил locklist, но это не помогает....
После runstats нужно пересобирать триггеры?
...
Рейтинг: 0 / 0
Триггеры... Поделитесь опытом
    #34301735
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Процент очень-очень не большой.... Там и процентом-то нельзя назвать.... А maxlocks стоит 22(по умолчанию)... LOcklist на всякий выставил 4096*4Kb... Вроде все должно хватать.....
...
Рейтинг: 0 / 0
Триггеры... Поделитесь опытом
    #34301754
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TORTПосле runstats нужно пересобирать триггеры?Нет.
...
Рейтинг: 0 / 0
Триггеры... Поделитесь опытом
    #34301785
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Explain.sql выдает стоимость 143,76....
При работе с таблицей saldo используется индекс CC1166263937297
...
Рейтинг: 0 / 0
Триггеры... Поделитесь опытом
    #34301877
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TORTExplain.sql выдает стоимость 143,76....
При работе с таблицей saldo используется индекс CC1166263937297Как же у вас тогда вся таблица блокируется?
Как вы это определили?

Может:
1. Уровень изоляции приложения - RR?
2. У таблицы LOCKSIZE сделали TABLE?
3. Приложение коммититься забывает?

Сделайте
UPDATE MONITOR SWITCHES USING LOCK ON
UPDATE COMMAND OPTIONS USING C OFF
DELETE FROM DB2ADMIN.PROVOD ...
GET SNAPSHOT FOR LOCKS FOR APPLICATION AGENTID ваш_номер_агента

Вывод последней команды покажите.
...
Рейтинг: 0 / 0
Триггеры... Поделитесь опытом
    #34301919
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Определил с помощью Quest'а.... В момент когда происходит удаление из db2admin.provod возникает блокировка Exclusive(S) на таблицу SALDO.....
...
Рейтинг: 0 / 0
Триггеры... Поделитесь опытом
    #34301921
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон Exclusive(X)
...
Рейтинг: 0 / 0
Триггеры... Поделитесь опытом
    #34301935
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И размер блокировки на таблицу - Строка.....:(
...
Рейтинг: 0 / 0
Триггеры... Поделитесь опытом
    #34302005
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Снимок блокировок программы

Отметка времени снимка = 02.02.20

Хэндл прикладной программы = 586
ID прикладной программы = *LOCAL
Номер последовательности = 0001
Имя прикладной программы = db2bp.
ID авторизации CONNECT = db2adm
Состояние прикладной программы = Рабоча
Время изменения статуса = Не соб
Кодовая страница прикладной программы = 1251
Блокировок поддерживается = 9
Общее время ожидания (мс) = 0

Список блокировок
Имя блокировки = 0x050010002D413E010000000052
Атрибуты блокировки = 0x00000000
Флаги освобождения = 0x40000000
Число блокировок = 1
Число удержаний = 0
Имя объекта блокировки = 20857133
Тип объекта = Строка
Имя табличного пространства = DATA
Схема таблицы = db2admin
Имя таблицы = SALDO
Режим = X

Имя блокировки = 0x050010002E413E010000000052
Атрибуты блокировки = 0x00000000
Флаги освобождения = 0x40000000
Число блокировок = 1
Число удержаний = 0
Имя объекта блокировки = 20857134
Тип объекта = Строка
Имя табличного пространства = DATA
Схема таблицы = db2admin
Имя таблицы = SALDO
Режим = X

Имя блокировки = 0x0500100040991E010000000052
Атрибуты блокировки = 0x00000000
Флаги освобождения = 0x40000000
Число блокировок = 1
Число удержаний = 0
Имя объекта блокировки = 18782528
Тип объекта = Строка
Имя табличного пространства = DATA
Схема таблицы = db2admin
Имя таблицы = SALDO
Режим = X

Имя блокировки = 0x0500070045500D020000000052
Атрибуты блокировки = 0x00000020
Флаги освобождения = 0x40000000
Число блокировок = 1
Число удержаний = 0
Имя объекта блокировки = 34426949
Тип объекта = Строка
Имя табличного пространства = DATA
Схема таблицы = db2admin
Имя таблицы = PROVOD
Режим = X

Имя блокировки = 0x0500070044500D020000000052
Атрибуты блокировки = 0x00000020
Флаги освобождения = 0x40000000
Число блокировок = 1
Число удержаний = 0
Имя объекта блокировки = 34426948
Тип объекта = Строка
Имя табличного пространства = DATA
Схема таблицы = db2admin
Имя таблицы = PROVOD
Режим = X

Имя блокировки = 0x53514C4332453036BD4A32C841
Атрибуты блокировки = 0x00000000
Флаги освобождения = 0x40000000
Число блокировок = 1
Число удержаний = 0
Имя объекта блокировки = 0
Тип объекта = Внутренн
Режим = S

Имя блокировки = 0x53514C4445464C5428DD630641
Атрибуты блокировки = 0x00000000
Флаги освобождения = 0x40000000
Число блокировок = 1
Число удержаний = 0
Имя объекта блокировки = 0
Тип объекта = Внутренн
Режим = S

Имя блокировки = 0x05000700000000000000000054
Атрибуты блокировки = 0x00000000
Флаги освобождения = 0x40000000
Число блокировок = 1
Число удержаний = 0
Имя объекта блокировки = 7
Тип объекта = Таблица
Имя табличного пространства = DATA
Схема таблицы = db2admin
Имя таблицы = PROVOD
Режим = IX

Имя блокировки = 0x05001000000000000000000054
Атрибуты блокировки = 0x00000000
Флаги освобождения = 0x40000000
Число блокировок = 2
Число удержаний = 0
Имя объекта блокировки = 16
Тип объекта = Таблица
Имя табличного пространства = DATA
Схема таблицы = db2admin
Имя таблицы = SALDO
Режим = IX
...
Рейтинг: 0 / 0
Триггеры... Поделитесь опытом
    #34302091
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так это...
Все нормально у вас, эксклюзивно таблицы не блокируются.
Может, quest не отличает IX блокировки таблицы от X?
...
Рейтинг: 0 / 0
Триггеры... Поделитесь опытом
    #34302119
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сам вот сижу и думаю....
В любом случае спасибо за советы...
...
Рейтинг: 0 / 0
Триггеры... Поделитесь опытом
    #34302176
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если это делается в хранимой процедуре? Монитор блокировки будет фиксировать?
...
Рейтинг: 0 / 0
Триггеры... Поделитесь опытом
    #34302337
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так... На всякий....
Одна процедура = Один пакет?
...
Рейтинг: 0 / 0
Триггеры... Поделитесь опытом
    #34302494
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TORTА если это делается в хранимой процедуре? Монитор блокировки будет фиксировать?Да.
TORTОдна процедура = Один пакет?Да.
...
Рейтинг: 0 / 0
Триггеры... Поделитесь опытом
    #34302519
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется нашел момент... Может для вас очевидный, я же его упустил....
В общем дело так....
Записи из таблицы provod удаляются также триггером, повешенным на другую таблицу!!!
Так вот, если делать Explain на delete from provod...., то индексы по saldo хватаются....
А если через еще один триггер, то нет...
...
Рейтинг: 0 / 0
Триггеры... Поделитесь опытом
    #34374642
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опять на те же грабли.... Где архитектурно могу ошибаться?
Есть таблица1, таблица2, таблица3....
При изменении таблицы1, изменяется таблица2.
При изменении таблицы2, изменяется таблица3.
Все это организовал на триггерах... По-моему очень удобно получилось...
Но при тестировании получается, что одна программа, изменяя таблицу1 эксклюзивно блокирует таблицу3... Соответственно все остальные приложения "курят"... К тому же, таблица1 изменяется довольно часто и совсем небольшими порциями...
1.Где чего не так понимаю?
И главное.... Так вообще делают или за это руки "отрывают"....?
...
Рейтинг: 0 / 0
25 сообщений из 38, страница 1 из 2
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Триггеры... Поделитесь опытом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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