Patrząc na inne przykłady, wymyśliłem następujące, ale wydaje się, że nie działa tak, jak bym chciał: chcę, aby zaktualizował zmodyfikowane informacje tylko wtedy, gdy QtyToRepair
wartość została zaktualizowana ... ale to nie działa że.
Jeśli skomentuję gdzie, to zmodyfikowane informacje są aktualizowane w każdym przypadku. Jak powiedziałem, inne przykłady skłoniły mnie do optymizmu. Wszelkie wskazówki są mile widziane. Dzięki.
Walter
ALTER TRIGGER [dbo].[tr_SCHEDULE_Modified]
ON [dbo].[SCHEDULE]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
UPDATE SCHEDULE SET modified = GETDATE()
, ModifiedUser = SUSER_NAME()
, ModifiedHost = HOST_NAME()
FROM SCHEDULE S
INNER JOIN Inserted I on S.OrderNo = I.OrderNo and S.PartNumber = I.PartNumber
WHERE S.QtyToRepair <> I.QtyToRepair
END
sql
sql-server
triggers
Walter de Jong
źródło
źródło
update()
- sprawdza tylko, czy kolumna pojawia się na liście aktualizacji i zawsze jest prawdziwe dla wstawek. Nie sprawdza, czy wartość kolumny uległa zmianie, ponieważ możesz mieć więcej niż jeden wiersz, w którym niektóre wartości uległy zmianie, a inne nie.Odpowiedzi:
Masz dwie możliwości odpowiedzi na swoje pytanie:
1- Użyj polecenia aktualizacji w wyzwalaczu.
2- Użyj Połącz między wstawioną tabelą a usuniętą tabelą
W przypadku użycia polecenia aktualizacji dla tabeli
SCHEDULE
i ustawieniaQtyToRepair
kolumny na nową wartość, jeśli nowa wartość jest równa starej wartości w jednym lub wielu wierszach, rozwiązanie 1 aktualizuje wszystkie zaktualizowane wiersze w tabeli zestawieniowej, ale rozwiązanie 2 aktualizuje tylko wiersze harmonogramu, których stara wartość nie jest równa nowej wartość.źródło
inserted
stołu w drugim zapytaniu? powinien być taki sam jak sam stół, prawda?fyi Kod, który otrzymałem:
źródło
WHERE S.QtyToRepair <> I.QtyToRepair AND D.QtyToRepair <> I.QtyToRepair
nigdy nie były uruchamiane / pasujące, ponieważ pierwsze kryteria nigdy nie były prawdziwe - wstawiona tabela zawsze pasowała do rzeczywistej wartości tabeli. Kluczem dla mnie było użycie `WHERE I.QtyToRepair <> D.QtyToRepair`. RównieżIF UPDATE (field)
pomoc z wyzwalania wielu wyzwalaczy.Należy
QtyToRepair
najpierw sprawdzić, czy jest aktualizowany.źródło
Chcesz wykonać następujące czynności:
Pamiętaj, że ten wyzwalacz będzie uruchamiany za każdym razem, gdy zaktualizujesz kolumnę, niezależnie od tego, czy wartość jest taka sama, czy nie.
źródło
Za każdym razem, gdy rekord jest aktualizowany, jest on „usuwany”. Oto mój przykład:
To działa dobrze
źródło