Отследить машину, вызывающую хранимую процедуру

Чтобы отследить, какой компьютер вызывает хранимую процедуру, вы можете использовать различные методы. Вот несколько примеров с фрагментами кода:

Метод 1: использование встроенной функции
Вы можете использовать функцию HOST_NAME() в SQL Server для получения имени компьютера, выполняющего хранимую процедуру. Вот пример:

CREATE PROCEDURE YourStoredProcedure
AS
BEGIN
    DECLARE @MachineName NVARCHAR(128)
    SET @MachineName = HOST_NAME()
    -- Rest of your stored procedure logic
    -- You can log or use @MachineName as needed
END

Метод 2: использование контекста приложения
Вы можете установить контекст приложения в коде приложения перед выполнением хранимой процедуры, передав имя компьютера в качестве параметра. Вот пример на C#:

using (SqlConnection connection = new SqlConnection(connectionString))
{
    using (SqlCommand command = new SqlCommand("YourStoredProcedure", connection))
    {
        command.CommandType = CommandType.StoredProcedure;
        // Set the machine name as a parameter
        command.Parameters.AddWithValue("@MachineName", Environment.MachineName);
        connection.Open();
        command.ExecuteNonQuery();
    }
}

В хранимой процедуре вы можете получить доступ к имени машины, используя параметр:

CREATE PROCEDURE YourStoredProcedure
    @MachineName NVARCHAR(128)
AS
BEGIN
    -- Rest of your stored procedure logic
    -- You can log or use @MachineName as needed
END

Метод 3: использование расширенных событий
Вы можете настроить сеанс расширенных событий в SQL Server для захвата имени компьютера при выполнении хранимой процедуры. Вот пример:

CREATE EVENT SESSION CaptureMachineName
ON SERVER
ADD EVENT sqlserver.sp_statement_completed
(
    ACTION (sqlserver.client_hostname)
    WHERE (sqlserver.database_name = 'YourDatabaseName' AND sqlserver.object_name = 'YourStoredProcedure')
)
ADD TARGET package0.asynchronous_file_target
(
    SET FILENAME = 'C:\Path\To\Log\capture_machine_name.xel'
)
WITH (MAX_MEMORY = 4096 KB, EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS)
GO
ALTER EVENT SESSION CaptureMachineName
ON SERVER
STATE = START;

Этот метод фиксирует имя компьютера при выполнении указанной хранимой процедуры и сохраняет его в указанном файле журнала.