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

Откуда:
Сообщений: 13
Доброго здоровья!

Стоит задача отловить и зафиксировать запросы вида:

RPC:completed

exec sp_executesql N'UPDATE T1 SET _UseSplitter = @P1
FROM dbo._AccumRgOpt15652 T1
WHERE (T1._RegID = @P2) AND (T1._Fld770 = @P3)',N'@P1 varbinary(1),@P2 varbinary(8000),@P3 numeric(10)',0x01,0x3DD77835E17A41418B58BB2FD64C39BA,0

Цветом выделены то, что может изменяться. Таблицы и числовые значения.

Вопрос: как это сделать лучше всего?

Триггер сделать, но у меня таблиц за которыми следить таким образом надо штук 40, это штук 40 триггеров надо получается? Как это скажется на нагрузке на сервер?

С помощью расширенных событий если, то не нашел как настроить фильтр именно на этот запрос. Все подряд собирать, думаю не лучшая идея.

Подскажите пожалуйста, голова опухает если честно.
12 фев 21, 16:05    [22280111]     Ответить | Цитировать Сообщить модератору
 Re: Отследить событие  [new]
invm
Member

Откуда: Москва
Сообщений: 9634
https://www.sqlservercentral.com/forums/topic/extended-events-filtering-based-on-sql_text
12 фев 21, 16:52    [22280151]     Ответить | Цитировать Сообщить модератору
 Re: Отследить событие  [new]
aleks222
Member

Откуда:
Сообщений: 1237
Grogan
Доброго здоровья!

Стоит задача отловить и зафиксировать запросы вида:

RPC:completed

exec sp_executesql N'UPDATE T1 SET _UseSplitter = @P1
FROM dbo._AccumRgOpt15652 T1
WHERE (T1._RegID = @P2) AND (T1._Fld770 = @P3)',N'@P1 varbinary(1),@P2 varbinary(8000),@P3 numeric(10)',0x01,0x3DD77835E17A41418B58BB2FD64C39BA,0

Цветом выделены то, что может изменяться. Таблицы и числовые значения.

Вопрос: как это сделать лучше всего?

Триггер сделать, но у меня таблиц за которыми следить таким образом надо штук 40, это штук 40 триггеров надо получается? Как это скажется на нагрузке на сервер?

С помощью расширенных событий если, то не нашел как настроить фильтр именно на этот запрос. Все подряд собирать, думаю не лучшая идея.

Подскажите пожалуйста, голова опухает если честно.


Что такое 40 таблиц? Ерунда.
Но триггер - оно надежнее.

А "событие" можно объехать на хромой козе.
13 фев 21, 13:42    [22280454]     Ответить | Цитировать Сообщить модератору
 Re: Отследить событие  [new]
SERG1257
Member

Откуда:
Сообщений: 2828
Если версия или редакция позволяют то аудит
https://docs.microsoft.com/en-us/sql/relational-databases/security/auditing/sql-server-audit-database-engine?view=sql-server-ver15
Построен на базе extended events
13 фев 21, 17:36    [22280507]     Ответить | Цитировать Сообщить модератору
 Re: Отследить событие  [new]
Grogan
Member

Откуда:
Сообщений: 13
Спасибо за ответы!

Опыта мало к сожалению, поэтому получилось пока так сделать:

CREATE EVENT SESSION [Audit] ON SERVER
ADD EVENT sqlserver.rpc_completed(SET collect_data_stream=(1),collect_output_parameters=(1),collect_statement=(1)
ACTION(sqlos.task_address,sqlos.task_elapsed_quantum,sqlos.task_time,sqlserver.client_app_name,sqlserver.context_info,sqlserver.database_name,sqlserver.request_id,sqlserver.server_instance_name,sqlserver.server_principal_name,sqlserver.server_principal_sid,sqlserver.session_resource_group_id,sqlserver.session_resource_pool_id,sqlserver.session_server_principal_name,sqlserver.sql_text,sqlserver.transaction_id,sqlserver.transaction_sequence,sqlserver.username)
WHERE (((([sqlserver].[equal_i_sql_unicode_string]([sqlserver].[database_name],N'DataBase')) AND([sqlserver].[equal_i_sql_unicode_string]([statement],N'exec sp_executesql N''UPDATE T1 SET _UseSplitter = @P1
FROM dbo._AccumRgOpt15652 T1
WHERE (T1._RegID = @P2) AND (T1._Fld770 = @P3)'',N''@P1 varbinary(1),@P2 varbinary(8000),@P3 numeric(10)'',0x01,0x3DD77835E17A41418B58BB2FD64C39BA,0')))OR ([sqlserver].[equal_i_sql_unicode_string]([statement],N'exec sp_executesql N''UPDATE T1 SET _UseSplitter = @P1
FROM dbo._AccumRgOpt25155 T1
WHERE (T1._RegID = @P2) AND (T1._Fld770 = @P3)'',N''@P1 varbinary(1),@P2 varbinary(8000),@P3 numeric(10)'',0x00,0x6BC52073D472D84EA1442D19230BB538,0')))OR ([sqlserver].[equal_i_sql_unicode_string]([statement],N'exec sp_executesql N''UPDATE T1 SET _UseSplitter = @P1
FROM dbo._AccumRgOpt15700 T1
WHERE (T1._RegID = @P2) AND (T1._Fld770 = @P3)'',N''@P1 varbinary(1),@P2 varbinary(8000),@P3 numeric(10)'',0x00,0x61D7A2B5D82E1F46A73B314EDBC411D1,0')))OR ([sqlserver].[equal_i_sql_unicode_string]([statement],N'exec sp_executesql N''UPDATE T1 SET _UseSplitter = @P1
FROM dbo._AccumRgOpt15701 T1
WHERE (T1._RegID = @P2) AND (T1._Fld770 = @P3)'',N''@P1 varbinary(1),@P2 varbinary(8000),@P3 numeric(10)'',0x00,0xCD37C20DA145F343BAACAE0B3FA22AF7,0')))OR ([sqlserver].[equal_i_sql_unicode_string]([statement],N'exec sp_executesql N''UPDATE T1 SET _UseSplitter = @P1
FROM dbo._AccumRgOpt15651 T1
WHERE (T1._RegID = @P2) AND (T1._Fld770 = @P3)'',N''@P1 varbinary(1),@P2 varbinary(8000),@P3 numeric(10)'',0x00,0x1C0A0641CB09AA498D5697BB3A4075BF,0')))
....
Go

По каким то причинам не могу более трех фильтров вида:
([sqlserver].[equal_i_sql_unicode_string]([statement],N'exec sp_executesql N''UPDATE T1 SET _UseSplitter = @P1
FROM dbo._AccumRgOpt15701 T1
WHERE (T1._RegID = @P2) AND (T1._Fld770 = @P3)'',N''@P1 varbinary(1),@P2 varbinary(8000),@P3 numeric(10)'',0x00,0xCD37C20DA145F343BAACAE0B3FA22AF7,0')))

Добавить не могу. Появляется значек, как будто это процедура или функция и выдает ошибку.

Подскажите пожалуйтса в чем дело?
15 фев 21, 01:49    [22280892]     Ответить | Цитировать Сообщить модератору
 Re: Отследить событие  [new]
aleks222
Member

Откуда:
Сообщений: 1237
Интересно, тредстартер знает, что обновление данных в таблице можно провести через merge или его запрос переписать так, что под фильтр он не попадет?
15 фев 21, 05:39    [22280909]     Ответить | Цитировать Сообщить модератору
 Re: Отследить событие  [new]
VladimirKr
Member

Откуда: СПб
Сообщений: 1062
aleks222
Интересно, тредстартер знает, что обновление данных в таблице можно провести через merge или его запрос переписать так, что под фильтр он не попадет?

Это 1с. Там ничего такого быть не может.
15 фев 21, 10:00    [22280959]     Ответить | Цитировать Сообщить модератору
 Re: Отследить событие  [new]
Grogan
Member

Откуда:
Сообщений: 13
aleks222
Интересно, тредстартер знает, что обновление данных в таблице можно провести через merge или его запрос переписать так, что под фильтр он не попадет?


Теперь знает. Но к созданию аудита посредством расширенных событий пока не приблизился.
15 фев 21, 10:08    [22280970]     Ответить | Цитировать Сообщить модератору
 Re: Отследить событие  [new]
Grogan
Member

Откуда:
Сообщений: 13
VladimirKr
aleks222
Интересно, тредстартер знает, что обновление данных в таблице можно провести через merge или его запрос переписать так, что под фильтр он не попадет?

Это 1с. Там ничего такого быть не может.



Все верно. Это 1с.
15 фев 21, 10:08    [22280973]     Ответить | Цитировать Сообщить модератору
 Re: Отследить событие  [new]
Grogan
Member

Откуда:
Сообщений: 13
Так никто и не подскажет почему больше 3х фильтров не влазиет в скрипт?
15 фев 21, 13:09    [22281067]     Ответить | Цитировать Сообщить модератору
 Re: Отследить событие  [new]
aleks222
Member

Откуда:
Сообщений: 1237
VladimirKr
aleks222
Интересно, тредстартер знает, что обновление данных в таблице можно провести через merge или его запрос переписать так, что под фильтр он не попадет?

Это 1с. Там ничего такого быть не может.


Ну, не фсе хакеры останавливаются на уровне 1с.
15 фев 21, 13:19    [22281070]     Ответить | Цитировать Сообщить модератору
 Re: Отследить событие  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1697
Grogan
Так никто и не подскажет почему больше 3х фильтров не влазиет в скрипт?


читайте документацию:
https://docs.microsoft.com/ru-ru/sql/t-sql/statements/create-event-session-transact-sql?view=sql-server-ver15
15 фев 21, 13:40    [22281087]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить