2015-04-29 43 views
1

我有三個表光標內觸發和更新表列

一個是列USER_ID,USER_NAME,名稱和lastModifiedDate爲userDetails。 其次是具有列roleId,RoleName和 的角色第三個表是具有列user_Id(外鍵引用UserDetails)和Role_id(外鍵引用Role)的User_Role。

現在的事情是任何更新或刪除操作發生在角色表中我需要通過從User_Role表獲取相應的映射user_Id來更新UserDetails表的列lastModifiedDate。

例如,我在角色表中將roleId設置爲1,2,3,4,並將roleId'3'與User_Id 101,102,103,104映射到User_Role表中。所以如果角色表中更新了roleId'3',那麼我需要從User_Role獲取這些映射的userId,並使用sysdate更新他們的lastModifieddate列。

我必須使用觸發器,但我怎麼不知道,因爲我在DB新手,有它不知道的...請幫助球員 我必須這樣做,在mysql中

+0

僅適用於mysql ... – Sharique

回答

0

你可以這樣創建觸發器:

create or replace trigger PT_AD_ROLE after DELETE OR UPDATE on ROLE_TABLE for each row 
     begin 

     update user_table set lastModifiedTime=current_timestamp() from user_table u,role_table r,user_role ur where r.role_id=ur.role_id and ur.user_id=u.user_id and r.role_id=:old.role_id; 
    end 

; 
+0

它將如何從user_role獲取user_Id的列表...可以讓我知道嗎? – Sharique

+0

無論何時您對角色表進行更改,:old.user_id將具有您所做更改的user_id。然後使用此值對user_table進行更改。 – uhs

+0

我的角色表沒有任何userId列...它映射到user_role表中。 有三個表 – Sharique

0

不用擔心,我們都是新的一次,SQL是爲那些不使用它一個奇怪和可怕的土地。這樣說的話,如果我可以支持這個策略而不是策略,我認爲在一個表中修改日期是由不同表格中的更改設置是一個壞主意。理想情況下,每個修改日期都應該反映該行最後一次修改時間,因爲您需要這樣做來排除故障並遵循監管鏈。

我的第一個替代建議將是用戶表的視圖與一些案例邏輯來確定哪個修改日期將顯示。您需要將lastModifiedDate添加到角色,最好是user_roles,但這些都不難設置。

Create View UserDetailUpdates 
as 
select User_Id 
    , User_name 
    , Name 
    , case when max(ud.lastModifiedDate) > max(ro.lastModifiedDate) 
    then max(ud.lastModifiedDate) 
    else max(ro.lastModifiedDate) end as lastModifiedDate 
    , case when max(ud.lastModifiedDate) > max(ro.lastModifiedDate) 
    then 'User Updated' 
    else 'Role Updated' end as ModificationType 
From dbo.userDetails ud 
    join dbo.User_Role ur on ur.user_id = ud.user_id 
    join dbo Role Ro on ro.roleid = ur.roleid 
Group by User_Id 
    , User_name 
    , Name 

然後,您只是查詢視圖,就像它是一個表,並應該覆蓋它。但是,如果您真的專注於使用單一更新日期的想法,我可以將其編輯爲答案,幸運的是,它不需要光標。

+0

是的,如果你可以幫助單個更新日期那麼這將有所幫助。 因爲每當角色表發生任何操作,我必須更新user_details表的lastModofiedDate。 我認爲觸發我們必須正確使用? – Sharique