Mam 10 procedur przechowywanych i każda z nich wstawia INSERT do jednej tabeliX.
Czy w ciele wyzwalacza tableX można uzyskać, który obiekt powoduje modyfikację tableX (przechowywany proc1 lub sp2 lub ....)?
Dziękuję Ci.
źródło
Mam 10 procedur przechowywanych i każda z nich wstawia INSERT do jednej tabeliX.
Czy w ciele wyzwalacza tableX można uzyskać, który obiekt powoduje modyfikację tableX (przechowywany proc1 lub sp2 lub ....)?
Dziękuję Ci.
Tak, można zidentyfikować działający kod, używając funkcji systemowej @@ procid i lepiej OBJECT_NAME (@@ PROCID), aby mieć pełną nazwę.
Definicja: „Zwraca identyfikator obiektu (ID) bieżącego modułu Transact-SQL. Moduł Transact-SQL może być procedurą składowaną, funkcją zdefiniowaną przez użytkownika lub wyzwalaczem. @@ PROCID nie może być określony w modułach CLR ani w przetwarzaj dostawcę danych ”.
Możesz przeczytać o tym tutaj .
Inną opcją byłoby sprawdzenie planu sql bieżącego spid i zapisanie tych informacji w tabeli rejestrowania. Przykładowe zapytanie, które zostanie użyte w każdej procedurze do zapisania danych audytu, to:
select sp.hostname, sp.program_name, sp.loginame,
st.text as query_text
from sysprocesses sp
cross apply sys.dm_exec_sql_text(sp.sql_handle) as st
where sp.spid = @@spid
Może jest tam zbyt wiele szczegółów ... ale wierzę, że masz pomysł.
Trzecią opcją byłoby wykorzystanie informacji kontekstu_informacji do bieżącej sesji SP. I skojarz gdzieś informacje kontekstowe zapisane tam z każdą procedurą. Na przykład w procedurze 1 piszesz 111 w kontekście, w procedurze 2 piszesz 222 .. i tak dalej.
Dużo więcej informacji dotyczących informacji o kontekście można przeczytać w tym pytaniu SO .
OBJECT_NAME(@@PROCID)
zwraca nazwę wyzwalacza, a nie wywołujący proc.Też chciałem to zrobić. Dziękuję za odpowiedź. Ponieważ wciąż tu jestem, opublikuję mój test, aby zaoszczędzić czas innym :)
źródło
XEvent zapewnia inny sposób poznania stosu T-SQL, chociaż SQL Server 2008 może nie obsługiwać używanego typu zdarzenia. Rozwiązanie składa się z wyzwalacza, błędu i sesji XEvent. Wziąłem przykład Jima Browna, aby pokazać, jak to działa.
Przede wszystkim przetestowałem rozwiązanie dla SQL Server 2016 SP2CU2 Dev Edition. SQL Server 2008 obsługuje niektóre EXevent, ale nie mam żadnego wystąpienia, więc nie mogłem go przetestować.
Chodzi o to, aby wygenerować błąd użytkownika w fałszywym bloku try-catch, a następnie złapać błąd w sesji XEvent za pomocą
tsql_stack
akcji.SQLSERVER.error_reported
Typ XEvent może wychwytywać wszystkie błędy, nawet jeśli blok try-catch je uwięził. Na koniecsys.dm_exec_sql_text
wyodrębnij zapytania T-SQL z uchwytów zapytań, któretsql_stack
daje akcja.Przykład odpowiedzi Jima Browna, którą opracowałem, pokazano poniżej. Wyzwalacz podnosi błąd z tekstem „catch me”. Sesja XEvent wychwytuje błędy tylko z tekstem „złap mnie”.
Teraz, jeśli uruchomisz sesję XEvent (SSMS, Eksplorator obiektów, Zarządzanie, Rozszerzone zdarzenia, Sesje, catch_insertion_into_Test), wykonasz usp_RootProcIDTest i przejrzysz bufor pierścieniowy sesji XEvent, powinieneś zobaczyć XML, który składa się z węzła
<action name="tsql_stack" package="sqlserver">
. Istnieje sekwencja węzłów ramki. Wstaw wartościhandle
atrybutu do funkcji systemowej sys.dm_exec_sql_text i voilà:XEvent pozwala ci robić znacznie więcej! Nie przegap okazji, aby się ich nauczyć!
źródło