Триггер DB2 iSeries для добавления и изменения временных меток и пользовательских полей

#db2 #ibm-midrange

#db2 #ibm-средний уровень

Вопрос:

Возможно, триггеры не нужны для добавленных / измененных дат, возможно, в любом случае существуют соответствующие функции для установки их значений:

Мой вопрос касается следующих полей,

 created (timestamp)
updated (timestamp)
createdBy (string, to hold the created by user name)
updatedBy (string, to hold the updated by user name)
  

как мне изменить таблицу таким образом, чтобы при создании и обновлении эти поля содержали соответствующие значения?

Редактировать: теперь мне просто нужно знать, как устанавливать поля UpdatedBy и updated timestamp при каждом обращении к записи.

Комментарии:

1. Хорошо, я вижу, что созданное поле обрабатывается с помощью одной только временной метки, значением по умолчанию является время вставки. Осталось одно…

2. «CreatedBy CHAR(30) ПОЛЬЗОВАТЕЛЬ ПО УМОЛЧАНИЮ» обрабатывает поле CreatedBy… Осталось еще два.

3. В этом руководстве даны ответы на мои вопросы о триггере datetime dbforums.com/db2/1612640-update-trigger-update-time-column.html , Я, вероятно, сам отвечу немного позже…

Ответ №1:

Создайте следующую таблицу для справки:

 create table test(                    
  id integer generated always as identity,    
  content char(60),                           
  createdBy char(30) default user,            
  created timestamp default current timestamp,
  updatedBy char(30),                         
  updated timestamp default null,             
  primary key(id)                             
)   
  

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

 insert into test (content) VALUES ('first thing'),
  ('second thing')      
  

Чтобы убедиться, что установлены значения по умолчанию для created и CreatedBy:

 select * from test
  

Для добавления триггеров обновления:

 CREATE TRIGGER mytrigger                   
  NO CASCADE BEFORE UPDATE ON test 
  REFERENCING NEW AS post                  
FOR EACH ROW MODE DB2ROW                   
SET                                        
 post.updated = CURRENT TIMESTAMP,         
 post.updatedBy = USER  
  

Чтобы проверить, работает ли вышеуказанное, давайте обновим значения в «содержимом»:

 update co05arh/test
  set content = 'first thing updated'
  where id = 1
  

Чтобы увидеть новые значения по умолчанию

 select * from co05arh/test
  

Затем мы должны увидеть что-то вроде

 ID  CONTENT                 CREATEDBY   CREATED                     UPDATEDBY   UPDATED
1   first thing updated     KEN         2011-04-29 16:16:17.942429  KEN         2011-04-29 16:16:28.649543
2   second thing            KEN         2011-04-29 16:16:18.01629   <null>      <null>