Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9634 |
https://www.sqlservercentral.com/forums/topic/extended-events-filtering-based-on-sql_text |
12 фев 21, 16:52 [22280151] Ответить | Цитировать Сообщить модератору |
aleks222 Member Откуда: Сообщений: 1237 |
Что такое 40 таблиц? Ерунда. Но триггер - оно надежнее. А "событие" можно объехать на хромой козе. |
||||
13 фев 21, 13:42 [22280454] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
aleks222 Member Откуда: Сообщений: 1237 |
Интересно, тредстартер знает, что обновление данных в таблице можно провести через merge или его запрос переписать так, что под фильтр он не попадет? |
15 фев 21, 05:39 [22280909] Ответить | Цитировать Сообщить модератору |
VladimirKr Member Откуда: СПб Сообщений: 1062 |
Это 1с. Там ничего такого быть не может. |
||||
15 фев 21, 10:00 [22280959] Ответить | Цитировать Сообщить модератору |
Grogan Member Откуда: Сообщений: 13 |
Теперь знает. Но к созданию аудита посредством расширенных событий пока не приблизился. |
||||
15 фев 21, 10:08 [22280970] Ответить | Цитировать Сообщить модератору |
Grogan Member Откуда: Сообщений: 13 |
Все верно. Это 1с. |
||||||||
15 фев 21, 10:08 [22280973] Ответить | Цитировать Сообщить модератору |
Grogan Member Откуда: Сообщений: 13 |
Так никто и не подскажет почему больше 3х фильтров не влазиет в скрипт? |
15 фев 21, 13:09 [22281067] Ответить | Цитировать Сообщить модератору |
aleks222 Member Откуда: Сообщений: 1237 |
Ну, не фсе хакеры останавливаются на уровне 1с. |
||||||||
15 фев 21, 13:19 [22281070] Ответить | Цитировать Сообщить модератору |
felix_ff Member Откуда: Moscow Сообщений: 1697 |
читайте документацию: 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 | ![]() |