2013-05-21 3 views
0

Удивление, может ли кто-нибудь помочь мне понять, как ведет себя триггер DB2 перед вставкой. У меня есть приложение Grails, которое вставляет строки в базу данных DB2. В таблице в вопросе имеет перед вставкой триггера, который обновляет дату и пользователь для обновления:DB2 Before Update Trigger Behavior

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 я установил все значения, включая идентификатор пользователя:

flatAdjustmentInstance.setUserID("TS37813") 

Мы используем общий идентификатор приложения и пароль через JNDI для подключения к базе данных. Для целей аудита мне нужно установить значение пользователя для входа в приложение. Единственное решение полностью удалить триггер и просто быть уверенным, что оно установлено?

+0

Вы задаете вопрос, неясно, можете ли вы подробнее рассказать? – dmahapatro

+0

В частности, я ищу, чтобы переопределить значение, используемое триггером для установки поля user_id. Я бы подумал, что, поскольку это предварительное обновление, оно будет использовать входящее значение, однако значение не будет изменено. –

+0

Да, в этом случае я думаю, что вы избавились от триггера, так как Trigger будет использовать информацию о пользователе из соединения, которое будет «applicationID» в вашем случае. Это будет немного обобщением, но вы можете добавить логику в триггер, чтобы проверить, уже ли отправлен user_id из приложения, и не устанавливайте идентификатор пользователя приложения в Trigger. Это моя теория, чтобы убедиться, что вы не выбрасываете курок. :) – dmahapatro

ответ

0

Переменная DB2 USER (также называемая специальным регистром) содержит идентификатор авторизации текущего соединения с базой данных. Если приложение желает передать другой идентификатор пользователя в DB2, он может сделать это, вызвав функцию API sqleseti() или хранимую процедуру WLM_SET_CLIENT_INFO() - more info here. Затем триггер может ссылаться на другой специальный регистр, CURRENT CLIENT_USERID.