Piszę spust, aby śledzić wszystkie zmiany zachodzące w tabeli. Niestety, tabela ma ponad 150 kolumn i chciałem uniknąć zapisywania każdej kolumny w kodzie (np. New.col1, new.col2 ....) i dlatego napisałem następujące zapytanie w "wyzwalaczu po aktualizacji"mysql Wyzwalacz do logowania, znajdź zmienione kolumny
INSERT INTO logs SELECT *, NOW() FROM abc WHERE abc.id = NEW.Id;
Ten pomysł powoduje wiele problemów z powodu powielania danych, które nie zostały zmienione w zapytaniu o aktualizację.
W skrócie Chcę dynamicznie dowiedzieć się, które kolumny były częścią kwerendy aktualizacji, a jeśli nie jest to możliwe, istnieje sposób na iterację przez wszystkie kolumny "nowego" wiersza, dzięki czemu mogę dynamicznie porównać stare. colName == new. @ colName?
Widziałem już Oracle PL/SQL: Loop Over Trigger Columns Dynamically, How to determine if anything changed in update trigger in t-sql i MySQL UPDATE trigger: INSERTing the values of the columns that actually changed.
Ostatnie łącze jest zamknięte na to, czego potrzebuję z tylko jedną różnicą, nie chcę twardo kodować nazw kolumn w poniższej instrukcji, ponieważ mam sposób ponad 100 kolumn we wszystkich tabelach, które zamierzam napisać podobnie spust na !!
I zostały obecnie w obliczu nowy rodzaj problemu ... Nawet jeśli jestem gotów ciężko kodem wszystkie moje 150 kolumn w moich wyzwalaczy, mam Trudno jest śledzić kolumnę "UpdatedBy"! Mój oryginalny stół śledzi osoby zalogowane w aplikacji i kto dokonał ostatniej zmiany za pośrednictwem aplikacji. Niestety, nasz dział pomocy technicznej może zmieniać dane bezpośrednio z bazy danych bez aktualizowania kolumny "updatedBy" iw takim przypadku nie ma możliwości, bym wiedział, czy "updatedBy" był częścią zapytania czy nie, i dlatego nie mogę ustawić tej kolumny do null, kiedy zajdzie taka potrzeba! Mam nadzieję, że miałem sens tutaj :) – Sap
To ma sens. Nic nie można z tym zrobić. Właśnie do tego służą interfejsy API i "interfejsy". Aby zmusić "pomoc" ludzi/innych programistów do robienia tego, co powinni. – Jegsar