Trigger i insert do logów

Trigger i insert do logów
LE
  • Rejestracja:około 10 lat
  • Ostatnio:7 miesięcy
  • Postów:68
0

Witam wszystkich!
Mam oto takie zadanko:

Stworzyłem sobie na tabeli trigger po updacie na pewnej kolumnie i wszystko pięknie śmiga, tylko chce aby ten trigger robił insert do tabeli z logami jeśli wyłapie że dana kolumna była updatowana, no i tak się dzieje, lecz teraz potrzebuję w tym logu zapisać jaka procedura zrobiła tego updata ?
Macie jakieś pomysły?

Marcin.Miga
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 5 godzin
  • Postów:2792
0

Musisz mu to przekazać...

abrakadaber
abrakadaber
eeee trigerowi?
LE
  • Rejestracja:około 10 lat
  • Ostatnio:7 miesięcy
  • Postów:68
0

Tylko jak wyciągnąć nazwę procedury która zrobiła updata?
czy tam object_id, to bez znaczenia, tylko abym miał jakiś punkt zaczepienia

edytowany 1x, ostatnio: leonkuczma
LD
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 2 lata
  • Postów:115
0

Możesz rejestrować wywołania procedur w samych procedurach zamiast w triggerze.

ML
  • Rejestracja:ponad 19 lat
  • Ostatnio:22 minuty
  • Postów:858
0

Ale niekoniecznie to procedura musi robić update, równie dobrze dane można zmienić zapytaniem, z aplikacji itp.
Wydaje mi się że trigger będzie widział tylko update na tabeli, a co go wykonało już nie sprawdzisz w samym triggerze.

LD
Pytacz sugerował potrzebę obsłużenia logu wywołań procedur :) Rozwiązanie wewnątrz procki jest o tyle dobre, że możesz sobie logować parametry wejściowe i wyjściowe. Czyli: EXECUTION_LOG moim zdaniem powinien stać obok innych logów.
ML
Pytacz chce logować zmiany danych w tabeli a przy okazji wiedzieć która procedura to zmieniła.
MM
pewnie chodzi mu o to, która procedura wywala mu aplikację
MM
  • Rejestracja:około 12 lat
  • Ostatnio:6 miesięcy
  • Postów:91
0

może niewiele pomogę, ale może skorzystać przy wywoływaniu procedur z variables ustawiając tam nazwę procedury, a potem zadanym przez Ciebie warunku odczytywać...?

woolfik
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 5 godzin
  • Postów:1597
0

W PL/SQL jest coś takiego jak dbms_utility.format_call_stack:
http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_util.htm#i997163
do którego masz dostęp z triggera. Wywołanie tego zwróci ci stos wszystkich kolejnych procedur. Co do TSQL to pewności nie mam ale znalazłem taki artykuł:
http://larrysteinle.com/2013/09/21/microsoft-sql-server-call-stack-adding-the-missing-oracle-feature/#more-901
który (przynajmniej w teorii bo sam tego nie sprawdzałem) powinien dać Ci ten sam efekt

edytowany 3x, ostatnio: woolfik
LE
  • Rejestracja:około 10 lat
  • Ostatnio:7 miesięcy
  • Postów:68
0

Cieżko Panowie z tym, też nie mogę stwierdzić jednoznacznie jakie procedury robią te updaty, nie mogę w nie też ingerować.
Wymyśliłem coś takiego :

Kopiuj
select c.name from  sys.dm_exec_trigger_stats a
inner join sys.dm_exec_procedure_stats b on b.last_execution_time=a.last_execution_time
inner join sys.procedures c on b.object_id=c.object_id
inner join sys.triggers d on a.object_id=d.object_id
where d.name like'%SEND_LOG_FOR_SAF_READY%'

ale to niestety nie do końca działa, jeśli procedura jest szybka, to zadziała, lecz jeśli procedura przed updatem coś jeszcze robi to juz nie zgrywają się czasy ostatniego wykonania i dupa.
Też nie jestem doświadczony za bardzo i cieżko mi coś mądrego wymyśleć :/

woolfik
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 5 godzin
  • Postów:1597
1

@leonkuczma da się choć z dokumentacji wyczytałem, że istnieje ryzyko wywalenia się: DBCC INPUTBUFFR

Kopiuj
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER Stack.MyTrigger ON Stack.myTable
WITH EXECUTE AS CALLER
FOR INSERT
AS
    BEGIN         
        DECLARE @ProgramName nvarchar(128)
        DECLARE @Text nvarchar(4000)
		
        SELECT @ProgramName = program_name FROM sys.dm_exec_sessions WHERE Session_id = @@SPID
		
       --get the text for what deleted the record
        DECLARE @Buffer table ( EventType nvarchar(30), Parms int, EventInfo nvarchar(4000) )
		
        INSERT INTO @Buffer ( EventType, Parms, EventInfo )
        EXEC ('DBCC INPUTBUFFER(@@SPID)')
  
        insert into Stack.Log(CallStack)     
        SELECT  EventInfo FROM @Buffer
    END
GO
edytowany 1x, ostatnio: woolfik

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.