我有三张桌子
一个是带有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
中完成答案 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
然后,您只需查询视图,就像它的表格一样,应该覆盖它。但是,如果您真的专注于使用单个更新日期的想法,我可以将其编辑到答案中,幸运的是它不需要光标。