2016-12-19 1 views
0

Я пытаюсь настроить триггер базы данных для регистрации некоторых данных об изменении. То, что я хотел бы достичь, это то, что всякий раз, когда значение моей таблицы обновляется, имя пользователя и дата также сохраняются. Я хотел бы поймать это в триггере.Как использовать список столбцов в триггер базы данных в SAP HANA

То, что я получил до сих пор это:

CREATE TRIGGER "MySchema"."updateTrigger" 
AFTER UPDATE EXCEPT OF "ChangedBy", "ValidForm" ON "MySchema"."MySchema.database::model.MyTable" 
REFERENCING NEW ROW mynewrow, OLD ROW myoldrow 
FOR EACH ROW 

BEGIN 
    /* UPDATE status values in Request Table */ 
    UPDATE "MySchema"."MySchema.database::model.MyTable" 
     SET "ChangedBy" = CURRENT_USER, "ValidFrom" = CURRENT_TIMESTAMP 
     WHERE "TableId"=:myoldrow.TableId; 

Я использовал эту SAP help страницу сюда CREATE TRIGGER. Но код, указанный выше, не работает. Она возвращает следующее:

sql syntax error: incorrect syntax near "EXCEPT"

Поэтому я использую триггер UPDATE после, но мне нужно, кроме как на полях я обновляю в триггере, чтобы не попасть в бесконечный цикл. Вся помощь приветствуется.

ответ

1

Синтаксическая ошибка, скорее всего, связана с тем, что предложение EXCEPT попало только в команду с помощью HANA SPS12. Вы используете SPS12 или новее?

Во всяком случае, подход, который вы принимаете, не очень хорош на многих уровнях и тот факт, что старое моделирование данных ABAP все еще вокруг, на самом деле не делает его лучше.

  1. «LAST_CHANGER» и «LAST_CHANGED_DATE» на самом деле не являются частью конкретного объекта, смоделированного с таблицей. Это метаинформация, которая должна храниться в другом месте.

  2. Триггеры очень специфичны для платформы, поэтому с этим вы устанавливаете на HANA как единственную платформу, на которой этот код будет работать. Но когда вы уже на одной платформе, вы можете использовать подходящую платформу для такого рода отслеживания изменений. В HANA это называется AUDIT и обеспечивает гораздо более гибкий и безопасный подход к этому ручному триггерному подходу.

  3. Триггеры были, являются и будут администрированием и устранением неполадок кошмара. Не зная явно их искать, они будут пропущены в любом анализе большую часть времени. По мере того как они делают «магически» на заднем плане, вероятность появления побочных эффектов довольно высока.

  4. Триггеры также оказывают значительное влияние на производительность обновления/вставки, поскольку они не запускаются асинхронно.

  5. С триггерами у вас есть дополнительный код для создания, обслуживания и тестирования. Любая идея, как это сделать? Указанные функции AUDIT требуют теперь дополнительного кодирования, обслуживания и тестирования. Кроме того, зависимость от данных системы HANA, таких как , имя пользователя автоматически управляется для функциональности AUDIT. Ваш код запуска не будет. Подумайте об изменении длины возможных имен пользователей (это произошло в предыдущих версиях HANA).

Зная, что все эти аргументы вряд ли будут услышаны, потому что триггеры столь привлекательной для разработчиков, ниже вы найдете рабочий пример того, как такое может быть сделано (на SPS12 - вы можете просто оставить из за исключением пункта о более ранних версиях):

drop table mytab; 
create column table mytab (id int, aaa nvarchar(20), bbb nvarchar(20), validfrom date, validto date, 
          last_changed timestamp, last_changer nvarchar(256)); 


create trigger update_trig 
before update except of validfrom, validto 
on mytab 
referencing new row newr 
for each row 
begin 
    newr.last_changed = current_utctimestamp; 
    newr.last_changer = current_user; 
end; 

drop trigger insert_trig; 
create trigger insert_trig 
before insert 
on mytab 
referencing new row newr 
for each row 
begin 
    newr.last_changed = current_utctimestamp; 
    newr.last_changer = current_user; 
end; 
truncate table mytab; 

insert into mytab (id, aaa, bbb) values (1, 'bla', 'blupp'); 

select * from mytab; 

/* 
ID AAA BBB  VALIDFROM VALIDTO LAST_CHANGED   LAST_CHANGER 
1 bla blupp ?   ?  2016-12-19 23:10:46.866 DEVDUDE  
*/ 

update mytab set aaa='lala' where id = 1; 

/* 
ID AAA  BBB  VALIDFROM VALIDTO LAST_CHANGED   LAST_CHANGER 
1 lala blupp ?   ?  2016-12-19 23:11:01.002 DEVDUDE  
*/ 

Опять же, только потому, что это компилируется и работает в случае использования A-линии, не означает, что это хорошая идея. Это не.

+0

Спасибо Lars, как за синтаксическую ошибку, я действительно все еще на SPS10. Я полностью пропустил, что файл справки был на HANA2. Спасибо что подметил это. Согласен с пунктами, которые вы суммируете, и посмотрим на ** аудит **. Очень важно, - Мат –

Смежные вопросы