Znalazłem rozwiązanie twojego problemu. To trochę trudne i wygląda na włamanie, ale wydaje się, że nie da się go rozwiązać w inny sposób.
Chodzi o to, aby utworzyć funkcję SQL .NET, która loguje dane tam, gdzie są potrzebne (plik, dziennik zdarzeń Windows, db itp.), Następnie utwórz moduł UDF SQL, który wywołuje tę funkcję .NET, a następnie wywołaj tę funkcję SQL funkcje przechodzące wszystkie parametry potrzebne do zalogowania. SQL Server nie sprawdza, co jest wewnątrz funkcji .net i możesz tam napisać całą logikę, której potrzebujesz.
Pomysł utworzenia funkcji SQL .net bez żadnych ograniczeń bezpieczeństwa jest brany z tego post.
więc stworzyć projekt NET z tego jednego pliku
using System;
namespace SqlTest
{
public class LogEvent
{
[Microsoft.SqlServer.Server.SqlFunction]
public static int Log(string data)
{
System.IO.File.AppendAllText(@"C:\Log\LogUDF.txt", data);
return 0;
}
}
}
podpisać z jakiegoś certyfikatu pfx (Project Properties -> zakładka podpisania).
Następnie nazwać tego zapytania
USE [master]
CREATE ASYMMETRIC KEY LogKey FROM EXECUTABLE FILE =
'C:\Work\ConsoleApplication1\SqlTest\bin\Debug\SqlTest.dll'
CREATE LOGIN LogLogin FROM ASYMMETRIC KEY LogKey
GRANT UNSAFE ASSEMBLY TO LogLogin
GO
USE [MyDB]
CREATE ASSEMBLY SqlTest FROM
'C:\Work\ConsoleApplication1\SqlTest\bin\Debug\SqlTest.dll'
WITH PERMISSION_SET = unsafe
GO
CREATE FUNCTION dbo.Log(@data as nvarchar(200))
RETURNS int
AS EXTERNAL NAME SqlTest.[SqlTest.LogEvent].Log
Tu trzeba zmienić ścieżkę do skompilowanej biblioteki MojaBD - nazwy bazy danych. I utworzysz funkcję dbo.Log SQL. Następnie możesz zadzwonić tam, gdzie potrzebujesz. Na przykład jak z tego TestFunction
CREATE FUNCTION TestFunction
(
@p1 int
)
RETURNS int
AS
BEGIN
DECLARE @temp int
SELECT @temp = [dbo].[Log] ('fff')
RETURN 1
END
Więc, nazywając SELECT TestFunction(1)
napisze 'fff'
tekst C:\Log\LogUDF.txt
pliku.
To wszystko. Kilka ważnych uwag:
- Serwer SQL powinien mieć uprawnienia (login/użytkownik) do zapisu w pliku
C:\Log\LogUDF.txt
.
- Trzeba mieć SQL Server Administrator
nie powinno być patrząc na SQL Server Profiler do tego? –
@PanagiotisKanavos Nie polecałbym profilera w ogóle. Śledzenie, być może, lub jeszcze lepsze, rozszerzone wydarzenia lub audyt. Profiler jest odpowiedni do lokalnego debugowania, ale absolutnie nie powinien być używany przeciwko systemom produkcyjnym. MOIM ZDANIEM. –
Czy możesz wyjaśnić * dlaczego * chcesz rejestrować wszystkie połączenia z funkcjami zdefiniowanymi przez użytkownika? Nie wpłynie to na odpowiedzi (cóż, nie sądzę), staram się tylko zrozumieć, co możesz na tym zyskać. –