光标内部触发并更新表列

时间:2015-04-29 05:27:18

标签: mysql sql database

我有三张桌子

一个是带有User_Id,User_name,Name和lastModifiedDate列的userDetails。 第二个是使用列roleId,RoleName和的角色 第三个表是User_Role,其中列为user_Id(引用UserDetails的外键)和Role_id(外键引用角色)。

现在,只要在Role表中发生任何更新或删除操作,我就需要通过从User_Role表中获取相应的映射user_Id来更新UserDetails表的lastModifiedDate列。

例如,我在Role表中将roleId设置为1,2,3,4,在User_Role表中将roleId“3”与user_Id 101,102,103,104映射。因此,如果在Role表中更新了roleId'3',那么我需要从User_Role获取那些映射的userId,并使用sysdate更新它们的lastModifieddate列。

我必须使用触发器,但我怎么不知道因为我是数据库中的新手并且对此没有任何了解...请帮助人们 我必须在mysql

中完成

2 个答案:

答案 0 :(得分: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

;

答案 1 :(得分: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

然后,您只需查询视图,就像它的表格一样,应该覆盖它。但是,如果您真的专注于使用单个更新日期的想法,我可以将其编辑到答案中,幸运的是它不需要光标。