2013-05-21 30 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