Вернуться

Листинг 1

Общая схема организации триггеров для предотвращения ошибок, вызванных изменяемыми или ограничиваемыми таблицами.


--| PACKAGE PK_Triggnnn
Create Or Replace Package PK_Triggnnn Is
  triggersEnabled  Boolean:=true;

  Procedure P_Reset;
  Procedure P_PutRowList(inRec In %RowType, 
    isNew In Boolean);
  Function  F_EmptyRowList(isNew In Boolean) 
    Return Boolean;
  Procedure P_Handle_Insert;
  Procedure P_Handle_Update;
  Procedure P_Handle_Delete;
End PK_Triggnnn;
/

--| PACKAGE BODY PK_Triggnnn
Create Or Replace Package Body PK_Triggnnn Is
  Type RowListType Is Table Of 
%RowType Index By Binary_Integer; newList RowListType; oldList RowListType; emptyList RowListType; newCount# Number:=0; oldCount# Number:=0; Procedure P_Reset Is Begin newCount#:=0; oldCount#:=0; newList:=emptyList; oldList:=emptyList; End P_Reset; Procedure P_PutRowList(inRec In
%RowType, isNew In Boolean) Is Begin If isNew Then newCount#:=newCount# + 1; newList(newCount#).:=inRec.; ........... newList(newCount#).:=inRec.; Else oldCount#:=oldCount# + 1; oldList(oldCount#).:=inRec.; ........... oldList(oldCount#).:=inRec.; End If; End P_PutRowList; Function F_EmptyRowList(isNew In Boolean) Return Boolean Is Begin If isNew Then Return (newCount# = 0); Else Return (oldCount# = 0); End If; End F_EmptyRowList; Procedure P_Handle_Insert Is Begin While newCount# > 0 Loop --| .....<Обработка вносимых записей> newCount#:=newCount# - 1; End Loop; End P_Handle_Insert; Procedure P_Handle_Delete Is Begin While oldCount# > 0 Loop --| .....<Обработка удаляемых записей>..... oldCount#:=oldCount# - 1; End Loop; End P_Handle_Delete; Procedure P_Handle_Update Is Begin While newCount# > 0 Loop --| .....<Обработка обновляемых записей>..... newCount#:=newCount# - 1; oldCount#:=oldCount# - 1; End Loop; End P_Handle_Update; End PK_Triggnnn; / --| INSERT TRIGGER Create Or Replace Trigger IBS_
Before Insert On
Begin If PK_Triggnnn.triggersEnabled Then PK_Triggnnn.P_Reset; End If; End; / Create Or Replace Trigger IBR_
Before Insert On
For Each Row Declare inRec
%RowType; Begin If PK_Triggnnn.triggersEnabled Then --|......<Обработка вносимой записи>...... --| Запоминание значений полей вносимой записи inRec.:=:new.; ........... inRec.:=:new.; PK_Triggnnn.P_PutRowList(inRec,True); End If; End; / Create Or Replace Trigger IAR_
After Insert On
For Each Row Begin If PK_Triggnnn.triggersEnabled Then --|......<Обработка внесенной записи>...... End If; End; / Create Or Replace Trigger IAS_
After Insert On
Begin If PK_Triggnnn.triggersEnabled Then If Not PK_Triggnnn.F_EmptyRowList(True) Then PK_Triggnnn.P_Handle_Insert; End If; End If; End; / --| DELETE TRIGGER Create Or Replace Trigger DBS_
Before Delete On
Begin If PK_Triggnnn.triggersEnabled Then PK_Triggnnn.P_Reset; End If; End; / Create Or Replace Trigger DBR_
Before Delete On
For Each Row Declare inRec
%RowType; Begin If PK_Triggnnn.triggersEnabled Then --|......<Обработка удаляемой записи>...... --| Запоминание значений полей удаляемой записи inRec.:=:old.; ........... inRec.:=:old.; PK_Triggnnn.P_PutRowList(inRec,False); End If; End; / Create Or Replace Trigger DAR_
After Delete On
For Each Row Begin If PK_Triggnnn.triggersEnabled Then --|......<Обработка удаляемой записи>...... End If; End; / Create Or Replace Trigger DAS_
After Delete On
Begin If PK_Triggnnn.triggersEnabled Then If Not PK_Triggnnn.F_EmptyRowList(False) Then PK_Triggnnn.P_Handle_Delete; End If; End If; End; / --| UPDATE TRIGGER Create Or Replace Trigger UBS_
Before Update On
Begin If PK_Triggnnn.triggersEnabled Then PK_Triggnnn.P_Reset; End If; End; / Create Or Replace Trigger UBR_
Before Update On
For Each Row Declare inRec
%RowType; Begin If PK_Triggnnn.triggersEnabled Then --|......<Обработка обновляемой записи>...... --| Запоминание новых значений полей обновленной записи inRec.:=:new.; ........... inRec.:=:new.; PK_Triggnnn.P_PutRowList(inRec,True); --| Запоминание старых значений полей обновленной записи inRec.:=:old.; ........... inRec.:=:old.; PK_Triggnnn.P_PutRowList(inRec,False); End If; End; / Create Or Replace Trigger UAR_
After Update On
For Each Row Begin If PK_Triggnnn.triggersEnabled Then --|......<Обработка обновляемой записи>...... End If; End; / Create Or Replace Trigger UAS_
After Update On
Begin If PK_Triggnnn.triggersEnabled Then If Not PK_Triggnnn.F_EmptyRowList(True) Then PK_Triggnnn.P_Handle_Update; End If; End If; End; /

Вернуться