Триггер для обновления определенной строки из таблицы SAP HANA - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь создать триггер в Hana Studio для обновления заданного реестра (столбец «F2» из таблицы «T2»), когда в таблице «T1» происходит обновление. На строку из «T1» в таблице «T2» ссылается поле «X1» (то есть X1 в T1 равно X2 в T2).

Я хотел бы получить значение из поля «X1» из таблицы «T1» (то есть обновляемой таблицы) и использовать его в качестве предложения where, чтобы узнать, какая строка должна обновляться в таблице «Т2».

Это мой триггер (или то, что я хотел бы сделать):

create trigger TRIGGERNAME
after update on "SCHEMANAME.T1" for each row
begin
update "SCHEMANAME.T2" 
set F2 = "MY NEW VALUE" 
where X2 = X1
end;

Проблема в том, что X1 - это поле из моей обновленной строки. Можно ли получить доступ к данным из обновленной строки в моем триггере?

1 Ответ

0 голосов
/ 12 сентября 2018

Вы ищете предложение REFERENCING new row as ... | old row as ....Подробности об этом можно найти в справочной документации .

. Простой пример:

Настройка таблицы

create table one (ID int primary key, F2 nvarchar(100));
create table two (ID int primary key, F2 nvarchar(100));

insert into one values (1, 'Bla');
insert into one values (2, 'Blupp');

insert into two values (1, 'Bla');
insert into two values (2, 'Blupp');

Создать триггер

create trigger "ONE_TO_TWO"
    after update 
    on "ONE"   
    referencing new row as new, old row as old 
    for each row
begin
    update "TWO" t
    set "F2" = :new."F2"
    where t."ID" = :old."ID";
end;

Проверить текущие данные

select 
      one.id as ONE_ID, one.f2 as ONE_F2
    , two.id as TWO_ID, two.f2 as TWO_F2
from 
    one full outer join two
    on one.id = two.id;

/*
ONE_ID  ONE_F2  TWO_ID  TWO_F2
1       Bla     1       Bla   
2       Blupp   2       Blupp 
*/   

Обновить запись и снова проверить данные

update "ONE" 
    set "F2" = 'CHANGED THIS'
    where "ID" = 1;

/*
ONE_ID  ONE_F2          TWO_ID  TWO_F2      
1       CHANGED THIS    1       CHANGED THIS
2       Blupp           2       Blupp       
*/    

Хотя использование триггера часто может показаться хорошим подходом, я рекомендую пересмотреть то, для чего он будет использоваться, и если нет более подходящих подходов для удовлетворения требований.Триггеры сами по себе всегда вводят «магию» в модель данных, так как они изменяют семантику обычных операторов - ваш UPDATE внезапно обновляет несколько таблиц - не будучи очевидным для пользователя БД.На самом деле, только если кто-то активно ищет триггеры, есть шанс, что влияние, которое они оказывают на поведение базы данных, понятно.

Для обновлений с несколькими таблицами хранимая процедура может обрабатывать зависимости, возможно,более очевидный и лучший способ достижения цели.

...