2015-04-29 42 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