2016-02-21 36 views
1

我试图创建一个时间戳列的表,每个更新的记录自动生成'当前时间戳'。我在使用ODBC驱动程序的DB2/400(版本V5R3)上。DB2/400 - 自动生成的更改时间戳(错误)

这是查询:

CREATE TABLE random_table_name ( 
ID     integer not null generated always as identity, 
USERS_ID    varchar (30), 
DETAILS    varchar (1000), 
TMSTML_CREATE  timestamp default current timestamp , 
TMSTMP_UPDATE  timestamp not null generated always for each row on update as row change timestamp, 
PRIMARY KEY (ID) 

我得到这个错误(翻译):

ERROR [42000] [IBM][iSeries Access ODBC Driver][DB2 UDB]SQL0104 - Token EACH not valid. Valid tokens: BIT SBCS MIXED. 

没有 'TMSTMP_UPDATE' 行的查询工作。我该如何解决这个问题?


编辑:好吧,我明白,在我的DB2版本,唯一的办法就是使用触发器,但今天AS400似乎是邪恶和我在一起。 我想这一点:

CREATE TRIGGER random_trigger_name 
AFTER UPDATE ON random_table_name 
REFERENCING NEW AS NEW_ROW 
FOR EACH ROW MODE DB2SQL 
BEGIN ATOMIC 
    SET NEW_ROW.TMSTM_UPDATE = CURRENT TIMESTAMP; 
END 

错误(翻译):

ERROR [42000] [IBM][iSeries Access ODBC Driver][DB2 UDB]SQL0312 - Variable TMSTM_UPDATE not defined or not available. 

列TMSTM_UPDATE存在,这是一个正常的时间戳。

编辑2:我已经通过用'之前'替换'后'来解决触发器问题。现在一切都按预期工作。谢谢你们!

+0

什么版本的DB2?期望的令牌列表表明它认为它出于任何原因处理基于字符的列。 –

+0

@ Clockwork-Muse DB2版本V5R3 – Davide

+0

管理找到[旧手册](http://faithwarren.com/images/glazers/committees/SQL/SQL%20Manuals/V5R3_SQL_Reference.pdf)(不是目前的很多更容易找到...)。您的版本不支持语法(可能直到V5R4,肯定是V6),这使@ Dan的答案正确。为什么你在这样一个旧版本(2个主要版本,超过10年),反正? –

回答

0

在iSeries DB2中有一种标准的方法。这是记录在这里:IBM Knowledge center - Creating a row change timestamp column

您应该将表定义更改为:

TMSTMP_UPDATE TIMESTAMP NOT NULL FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP 

我在过V7R2在生产中使用的表它,它就像一个魅力:)希望这将是可供V5R3

编辑

正如查尔斯下文提到的不幸的是此功能可用,因为DB2为我V6R1

+1

直到v6.1,行更改时间戳才添加到DB2 for IBM i ... – Charles