我有三个桌子用户,办公室和一个角色地图。用户Id将是针对office经理和办公室主管的到Office表的FK。角色和用户Id将映射到角色映射表中,如下所示。删除office时,office表的活动列将更新为'N‘。当办公室被删除时,我必须检查办公室经理是否作为任何其他办公室的办公室经理。(同一个人也可以是另一个市场的经理)如果他不是,那么我必须删除角色映射表中的条目,将活动标志更新为'N‘。
表用户
User ID | User Name |
--------------------------
1 | Mark |
2 | George |
3 | Rick |
4 | Alex |表厅
Office ID | Office Name | Office Manager| Office Head | Active |
---------------------------------------------------------------------------
1 | Off1 | 1 | 2 | Y |
2 | Off2 | 1 | 4 | Y |角色映射
User ID | User Role | Active |
---------------------------------------------
1 | Office Manager | Y |
2 | Office Head | Y |
4 | Office Head | Y |因此,在这个示例中,如果我删除Office 2,那么我需要将角色映射表中的第三个条目更新为下面的OFfice管理器角色映射,因为相同的用户也是Off1的管理器。
角色地图--更新后
User ID | User Role | Active |
-------------------------------------------
1 | Office Manager | Y |
2 | Office Head | Y |
4 | Office Head | N |我不知道如何在pl/sql中实现这个查询。有人能带我到这里来吗?
发布于 2015-04-06 15:11:26
我认为在这种情况下不使用merge会更安全。删除office或将其状态更新为非活动后,只需运行此update
update role_map set active = 'N'
where (user_role = 'Office Head'
and not exists (
select 1 from office
where office_head = role_map.user_id and active = 'Y'))
or (user_role = 'Office Manager'
and not exists (
select 1 from office
where office_manager = role_map.user_id and active = 'Y'));我不确定是否需要表role_map,也许可以用视图替换它,但也许可以存储一些其他数据。
发布于 2015-04-06 15:10:38
如果您已经从OFFICE表中删除了行,则只需检查OFFICE表中的员工是否有活动角色,只需执行以下简单的更新-
UPDATE ROLE_MAP
SET active='N'
where user_id not in
(SELECT office_manager from office
UNION ALL
SELECT office_head from office)发布于 2015-04-06 15:20:46
PLSQL合并-在不存在行时更新
我不认为当在MERGE语句中与不匹配时,您无法使用进行更新。
为了避免每次删除之后进行手动更新,您可以在office表上创建删除触发器之后的,这样每当您从office表中删除一行时,都可以更新role_map表。update语句如下所示:
UPDATE role_map SET active = 'N' WHERE user_id = :OLD.office_head;例如,只是一个伪代码
CREATE OR REPLACE TRIGGER office_trg
AFTER DELETE
ON office
FOR EACH ROW
DECLARE
-- variable declarations
BEGIN
-- check any conditions if required
UPDATE role_map SET active = 'N' WHERE user_id = :OLD.office_head;
EXCEPTION
WHEN ...
-- exception handling
END;https://stackoverflow.com/questions/29472731
复制相似问题