powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASE, update trigger, отловить изменения в PK
9 сообщений из 9, страница 1 из 1
ASE, update trigger, отловить изменения в PK
    #38933362
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблицы:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create table a (
   id integer not null primary key,
   v integer null
)
create table b (
   dt datetime not null,
   o_id integer null,
   o_v integer null,
   n_id integer null,
   n_v integer null
)
go


Хочется сделать лог изменений a в b.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create trigger i on a for insert as
insert into b
select getdate(), null, null, id, v
from inserted
go
create trigger d on a for delete as
insert into b
select getdate(), id, v, null, null
from deleted
go
create trigger u on a for update as
insert into b
select getdate(), deleted.id, deleted.v, inserted.id, inserted.v
from deleted, inserted
where deleted.id = inserted.id
go


Это идеально работает для простых полей. Но делает чушь если обновление произошло в поле id.

Спрашивается, как быть?
...
Рейтинг: 0 / 0
ASE, update trigger, отловить изменения в PK
    #38933401
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

придумать как сравнивать записи без условия
Код: sql
1.
where deleted.id = inserted.id



условие 100% не выполняется при обновлении Id...
...
Рейтинг: 0 / 0
ASE, update trigger, отловить изменения в PK
    #38933404
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если другого уникального идентификатора записи нет то сопоставить deleted <-> inserted - ИМХо задача не тривиальная :).

Добавляйте identity поле в таблицу a и ориентируйтесь на него...
...
Рейтинг: 0 / 0
ASE, update trigger, отловить изменения в PK
    #38933427
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

первичный ключь менять нельзя.
я думал, ты знаешь...
...
Рейтинг: 0 / 0
ASE, update trigger, отловить изменения в PK
    #38933482
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivWhite Owl,

первичный ключь менять нельзя.
я думал, ты знаешь... Я знаю.
Это мы озаботились наконец приделать отчетность к одному древнему проекту. Таблицы там менять нельзя иначе клиент умрет, а он еще на PB6.5 написан.... И в этом клиенте запросто можно менять первичный ключ. Да и используются эти таблицы в оооочень многих хранимых процедурах (около трех тысяч уже)...
В общем, сижу грущу. А вдруг у inserted-deleted есть какой-нибудь тайный rowid? Или как-нибудь через if update () and @@rowcount=1 можно извернуться?
Как бы к ASE 15 приделать триггер на for each row?
...
Рейтинг: 0 / 0
ASE, update trigger, отловить изменения в PK
    #38933500
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

так же все просто.
Если изменился первичный ключ триггер нужно откатывать
...
Рейтинг: 0 / 0
ASE, update trigger, отловить изменения в PK
    #38933520
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivWhite Owl,

так же все просто.
Если изменился первичный ключ триггер нужно откатыватьЭто пойдет вразрез с нынешними business rules. Я не могу просто запретить изменять PK, он естественный и значит может меняться. К сожалению, клиент в этом случае тупо делает update. Если бы он разбивал операцию на delete-insert то и проблем бы не было...

..... а впрочем. Если верить документации, то при update эти самые deleted и inserted таблицы заполняются не одновременно. Сначала старые строки переносятся из таблицы в deleted, потом новые строки одновременно копируются в таблицу и inserted. Если можно сыграть на этом, то...
...
Рейтинг: 0 / 0
ASE, update trigger, отловить изменения в PK
    #38933542
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А собственно говоря. Если PK меняется, то мы всегда можем это рассматривать как пару удалить-вставить. А значит и триггер на обновление превращается в:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create trigger u on a for update as
if update(id)
begin
	insert into b
	select getdate(), id, v, null, null
	from deleted

	insert into b
	select getdate(), null, null, id, v
	from inserted

end else begin
	insert into b
	select getdate(), deleted.id, deleted.v, inserted.id, inserted.v
	from deleted, inserted
	where deleted.id = inserted.id
end


В общем-то, вполне нормально получается. То что в реальности PK был обновлен через update, нам в логе знать вовсе не обязательно.
...
Рейтинг: 0 / 0
ASE, update trigger, отловить изменения в PK
    #38933604
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlMasterZivWhite Owl,

так же все просто.
Если изменился первичный ключ триггер нужно откатыватьЭто пойдет вразрез с нынешними business rules. Я не могу просто запретить изменять PK, он естественный и значит может меняться. К сожалению, клиент в этом случае тупо делает update. Если бы он разбивал операцию на delete-insert то и проблем бы не было...

..... а впрочем. Если верить документации, то при update эти самые deleted и inserted таблицы заполняются не одновременно. Сначала старые строки переносятся из таблицы в deleted, потом новые строки одновременно копируются в таблицу и inserted. Если можно сыграть на этом, то...

На самом деле не важно, как у тебя будет выполнена эта операция физически.
Логически невозможно соотнести друг с другом строки из набора старых и новых версий строк, невозможно сформировать
пары (старая строка--новая строка), потому что первичный ключ меняется.

И отсюда кстати --- очевидный выход. Надо добавить ещё один ключ (уникальный), который никогда не будет меняться .
Делается это вполне себе легко, добавляется поле, в него кладётся например значение старого ключа, или номер по порядку,
по вкусу, в триггере запрещается его модификация, в дефолте генерируется уникальное значение (или можно использовать identity) --
и тогда ты сможешь в триггере на UPDATE всегда сотнести друг с другом старую и новую версию записи по значениям этого нового ключа, которые никогда не меняются.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASE, update trigger, отловить изменения в PK
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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