Oracle 插入、更新、删除触发器与 Join

Oracle Insert, Update, Delete Trigger with Join

我正在尝试为子视图实施 Oracle 触发器,但我需要能够将子视图连接到它们的父视图以便进行角色权限检查。

在 SQL 服务器中,我可以这样操作:

ALTER TRIGGER [dbo].[ASetTrt_I] ON [dbo].[UCV_ASet_TRT]
                INSTEAD OF Insert AS   
                BEGIN   
                    SET NOCOUNT ON;    
                    IF EXISTS (SELECT 1 from INSERTED i INNER JOIN [Analysis_Sets] p on i.[key] = p.[ID] 
                        WHERE ([dbo].IsMemberOf(p.[UpdateRole]) <> 1 and [dbo].IsMemberOf('db_owner') <> 1))
                            RAISERROR ('Update failed due to insufficient permission',11,1)
                    INSERT INTO [Set_Trts] ( [ID], [Name], [key], [f_lTreatmentKey], [f_lOrder] ) 
                    SELECT 
                    inserted.[ID], inserted.[Name], inserted.[key], inserted.[f_lTreatmentKey], inserted.[f_lOrder]                               
                    FROM inserted 
                    INNER JOIN [Sets] parentT 
                        on inserted.[key] = parentT.[ID]
                    WHERE (([dbo].IsMemberOf('db_owner')=1) or ([dbo].IsMemberOf(parentT.[UpdateRole])=1))
                END  

我可以在 Oracle 中做些什么来复制连接功能?

我试过从 :New 中选择 SS 从插入中选择的方式,但这似乎不起作用..

谢谢。

您不需要加入。 :new 伪行只是可用的,可以像记录类型一样被引用。它不是类似于 table 的结构,并且仅在 for each row 触发器中可用。所以你的插入将是这样的:

INSERT INTO Analysis_Set_Trts ( ID, Name, f_lAnalysisSetKey, f_lTreatmentKey,
  f_lOrder ) 
SELECT :new.ID, :new.Name, :new.f_lAnalysisSetKey, :new.f_lTreatmentKey,
  :new.f_lOrder                            
FROM Analysis_Sets parentT 
WHERE parentT.ID = :new.f_lAnalysisSetKey
AND ((IsMemberOf('db_owner')=1) or (IsMemberOf(parentT.UpdateRole)=1));

...虽然不太确定最后一行在做什么或等效的是什么。