Триггер для обновления определенной строки из таблицы SAP HANA

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

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

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

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 - это поле из моей обновленной строки. Есть ли способ получить доступ к данным из обновленной строки моего триггера?


person Nicole    schedule 11.09.2018    source источник


Ответы (1)


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

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

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 внезапно обновляет несколько таблиц - не будучи очевидным для пользователя БД. Фактически, только при активном поиске триггеров есть шанс понять, как они влияют на «поведение» базы данных.

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

person Lars Br.    schedule 12.09.2018
comment
Вроде верный путь, но у меня есть еще одно сомнение. Я хотел бы, чтобы триггер срабатывал только при обновлении данного столбца из таблицы ONE, а не только при любом обновлении в таблице ONE. Можно ли установить конкретный столбец после обновления в ОДНОМ заявлении? Например, если меня интересуют только обновления столбца F2 в таблице ONE, можно ли установить оператор после обновления в ONE.F2? - person Nicole; 12.09.2018
comment
Да, в связанной документации показано, как можно ограничить действие триггера определенными столбцами или исключить определенные столбцы. Если вы обновите вопрос этим дополнительным требованием, я соответствующим образом обновлю ответ. - person Lars Br.; 12.09.2018