Trigger i insert do logów

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?

0

Musisz mu to przekazać...

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

0

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

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.

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ć...?

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

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 :

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ć :/

1

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

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1