Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как из триггера или констрейта узнать процедуру?  [new]
Ъ1
Member

Откуда:
Сообщений: 23
Которая сделала неправильный insert или update?

2008 r2
20 янв 17, 18:09    [20128622]     Ответить | Цитировать Сообщить модератору
 Re: Как из триггера или констрейта узнать процедуру?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Нету коллстека, не узнаете.
20 янв 17, 18:11    [20128632]     Ответить | Цитировать Сообщить модератору
 Re: Как из триггера или констрейта узнать процедуру?  [new]
Ъ1
Member

Откуда:
Сообщений: 23
Гавриленко Сергей Алексеевич
Нету коллстека, не узнаете.


Спасибо, примерно понял,
А профайлером можно поймать?
20 янв 17, 18:13    [20128646]     Ответить | Цитировать Сообщить модератору
 Re: Как из триггера или констрейта узнать процедуру?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 4468
Ъ1
Гавриленко Сергей Алексеевич
Нету коллстека, не узнаете.


Спасибо, примерно понял,
А профайлером можно поймать?


да
20 янв 17, 18:52    [20128762]     Ответить | Цитировать Сообщить модератору
 Re: Как из триггера или констрейта узнать процедуру?  [new]
Ъ1
Member

Откуда:
Сообщений: 23
Ролг Хупин, извините , а как?

Какие события настраивать, кторые ловить?

Через Error? Но их много.
20 янв 17, 19:41    [20128895]     Ответить | Цитировать Сообщить модератору
 Re: Как из триггера или констрейта узнать процедуру?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9169
Ъ1,

элементарно - добавьте во все процедуры обработчик ошибок. а обработчиком можно и стек вызова организовать (я публиковал образец такого кода в концеренции) О чем я твержу всё время - пишите процедуры с обработчиками, а не так, как это делали отцы 20 лет назад.
21 янв 17, 15:18    [20130225]     Ответить | Цитировать Сообщить модератору
 Re: Как из триггера или констрейта узнать процедуру?  [new]
invm
Member

Откуда: Москва
Сообщений: 9913
Ъ1,

Если отлавливать ошибки через Extended Events, можно получить T-SQL Stack.
21 янв 17, 15:34    [20130251]     Ответить | Цитировать Сообщить модератору
 Re: Как из триггера или констрейта узнать процедуру?  [new]
Ruiner
Member

Откуда: СПб
Сообщений: 66
Ъ1,

я через dbcc inputbuffer ловил. весь стек, конечно, не узнаете, но хоть что-то.
приблизительно так:
-- =============================================
-- Author:      Grigoryev
-- Create date: 20150731
-- Description: Отслеживание модификаций полей [Privileges], [IsActual] в [Rights].[User]
-- =============================================
CREATE TRIGGER [Rights].[triu_Rights_User] ON [Rights].[User] AFTER INSERT, UPDATE
AS BEGIN
    SET NOCOUNT ON;
    DECLARE @nvSQL nvarchar (max);

    IF NOT (UPDATE ([Privileges]) OR UPDATE ([IsActual])) RETURN;

    -- connection context.
    CREATE TABLE #TInputBuffer ([EventType] nvarchar (30), [Parameters] smallint, [EventInfo] nvarchar (4000));

    SET @nvSQL = N'DBCC INPUTBUFFER (' + CAST (@@SPID AS nvarchar (16)) + ')';
    INSERT INTO #TInputBuffer EXEC sp_executesql @nvSQL;

    -- data.
    ;WITH ConnInfo AS (
        SELECT DES.[host_name], DES.[program_name], DES.[host_process_id], DES.[login_name]
              ,DER.[start_time], DER.[status], DER.[command]
              ,IB.[EventInfo]
          FROM sys.[dm_exec_sessions] DES
               INNER JOIN sys.[dm_exec_requests] DER ON (DER.[session_id] = DES.[session_id])
               CROSS JOIN #TInputBuffer IB
         WHERE DES.[session_id] = @@SPID),
         DataInfo AS (
        SELECT [Operation]          = CASE WHEN D.[Privileges] IS NULL THEN 'I' ELSE 'U' END
              ,[OperationTime]      = GETDATE ()
              ,[OperationSPID]      = @@SPID
              ,[OperationNumber]    = ROW_NUMBER () OVER (ORDER BY (SELECT NULL))
              ,[UserId]             = ISNULL (D.[UserId], I.[UserId])
              ,[UserName]           = ISNULL (D.[UserName], I.[UserName])
              ,[OldPrivileges]      = D.[Privileges]
              ,[OldIsActual]        = D.[IsActual]
              ,[NewPrivileges]      = I.[Privileges]
              ,[NewIsActual]        = I.[IsActual]
          FROM Deleted D
               FULL JOIN Inserted I ON I.[UserId] = D.[UserId])
    INSERT INTO [Service].[SMTLG29388_RightsUserLog] ([Operation], [OperationTime], [OperationSPID], [OperationNumber], [UserId], [UserName], [OldPrivileges], [OldIsActual], [NewPrivileges], [NewIsActual], [host_name], [program_name], [host_process_id], [login_name], [start_time], [status], [command], [EventInfo])
    SELECT DI.[Operation], DI.[OperationTime], DI.[OperationSPID], DI.[OperationNumber], DI.[UserId], DI.[UserName], DI.[OldPrivileges], DI.[OldIsActual], DI.[NewPrivileges], DI.[NewIsActual], CI.[host_name], CI.[program_name], CI.[host_process_id], CI.[login_name], CI.[start_time], CI.[status], CI.[command], CI.[EventInfo]
      FROM DataInfo DI
           LEFT OUTER JOIN ConnInfo CI ON (DI.[OperationNumber] = 1);

END;
GO
21 янв 17, 23:26    [20130935]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить