pierwszy raz tworzę wyzwalacze i procedury więc proszę o wyrozumiałość
wypociłem coś takiego:
CREATE Trigger UpdateOsobyGraf
On Osoby
AFTER Insert,Update
AS
BEGIN
Declare @Os_Recid Int;
Declare @Os_grafikOD datetime;
Declare @Os_grafikDO datetime;
Declare @Os_grafikDO_OLD datetime;
SET @Os_Recid = (SELECT i.RecId FROM inserted i);
SET @Os_grafikOD = (SELECT i.GrafikOD From inserted i);
SET @Os_grafikDO = (SELECT i.GrafikDO From inserted i);
SET @Os_grafikDO_OLD = (SELECT d.GrafikDO From deleted d);
SET NOCOUNT ON
IF(UPDATE (GrafikOD) OR UPDATE (GrafikDO))
BEGIN
IF (@Os_grafikDO_OLD IS NULL) -- jeżeli nowy wiersz w tabeli Osoby to dodaj wszystkie miesiace OD..DO
BEGIN
WHILE (@Os_grafikOD<=@Os_grafikDO)
BEGIN
INSERT INTO GrafikPosilkow ([OsobaID],[DataGraf]) VALUES (@Os_Recid,@Os_grafikOD)
SET @Os_grafikOD = DateAdd(month, 1, @Os_grafikOD)
END
END
ELSE --jeżeli update dodaj wszystkie miesiące OD..DO pod warunkiem że takich rekordów jeszczenie ma
BEGIN
WHILE (@Os_grafikOD <= @Os_grafikDO)
BEGIN
IF NOT EXISTS (SELECT 1 FROM GrafikPosilkow gp WHERE gp.osobaID=@Os_Recid AND gp.DataGraf=@Os_grafikOD)
BEGIN
INSERT INTO GrafikPosilkow ([OsobaID],[DataGraf]) VALUES (@Os_Recid,@Os_grafikOD)
END
SET @Os_grafikOD = DateAdd(month, 1, @Os_grafikOD)
END
END
END
END
SET NOCOUNT OFF
i generalnie działa
ale wydaje mi się, że jest to mało optymalne rozwiązanie
poza tym jeśli zostanie przedział zmniejszony procedura powinna wykonać update na tabeli GrafikiPosilkow
i dla wierszy pozostałych (czyli between @Os_grafikDO AND @Os_grafikDO_OLD) w kolumnie GrafikiPosilkow.Pomin dać 1 ale nie mam pojęcia jak to jeszcze wcisnąć
Proszę radę jak powyższą procedurę zoptymalizować i dodać opisany warunek
z góry wielkie dzięki