2013-05-21 31 views
0

想知道是否有人能够帮助我理解插入触发器之前的DB2的行为。我有一个将行插入DB2数据库的Grails应用程序。有关该表具有插入之前触发该更新的更新日期和用户:DB2在更新触发器行为之前

CREATE TRIGGER WTESTP.SCSMA11I NO CASCADE BEFORE INSERT ON 
WTESTP.SCSMA01T REFERENCING NEW AS NEWROW FOR EACH ROW MODE 
DB2SQL BEGIN ATOMIC SET NEWROW.LST_UPDT_TMSP = 
CURRENT_TIMESTAMP ; SET NEWROW.USER_ID = RTRIM (USER) ; END ; 

在我的Grails应用程序,我将所有的值,包括用户ID:

flatAdjustmentInstance.setUserID("TS37813") 

我们使用一个通用的应用程序ID和密码通过JNDI来建立到数据库的连接。为了审计目的,我需要将用户的值设置为登录到应用程序的用户。是唯一的解决方案,完全删除触发器,只是确定它被设置?

+0

你的问题有点不清楚,你能详细说明一下吗? – dmahapatro

+0

具体而言,我希望覆盖触发器用于设置user_id字段的值。我会认为,因为它是更新之前它将使用传入的值,但是值不会更改。 –

+0

是的,在这种情况下,我认为你已经摆脱了触发器,因为触发器将使用来自连接的用户信息,在你的情况下这将是'applicationID'。这将有点泛化,但是您可以在触发器中添加一个逻辑来检查user_id是否已经从应用程序发送,然后不要将应用程序用户ID设置为Trigger。这是我的理论,只是为了确保你不会丢掉触发器。 :) – dmahapatro

回答

0

DB2 USER变量(也称为“特殊寄存器”)包含当前数据库连接的授权标识。如果某个应用程序希望将另一个用户标识传递给DB2,则可以通过调用API函数sqleseti()或存储过程WLM_SET_CLIENT_INFO() - more info here来完成此操作。然后触发器可以引用另一个特殊寄存器CURRENT CLIENT_USERID