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

Откуда: Київ
Сообщений: 59
Добрый день.
Есть табличка, у которой нет никаких зависимостей (т.е. ни обновляемых процедур, ни чего-либо ещё).
Сегодня с утра появились новые данные непонятно откуда.

Запрос ниже (найденный на хабре) показывает запросы, которые использовались по отношению к этой таблице, их план выполнения и т.д.

SELECT SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1,
((CASE qs.statement_end_offset
WHEN -1 THEN DATALENGTH(qt.TEXT)
ELSE qs.statement_end_offset
END - qs.statement_start_offset)/2)+1) request,
qs.execution_count,
qs.total_logical_reads, qs.last_logical_reads,
qs.total_logical_writes, qs.last_logical_writes,
qs.total_worker_time,
qs.last_worker_time,
qs.total_elapsed_time/1000000 total_elapsed_time_in_S,
qs.last_elapsed_time/1000000 last_elapsed_time_in_S,
qs.last_execution_time,
qp.query_plan
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
where SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1,
((CASE qs.statement_end_offset
WHEN -1 THEN DATALENGTH(qt.TEXT)
ELSE qs.statement_end_offset
END - qs.statement_start_offset)/2)+1) like '%table_name%'
ORDER BY qs.total_worker_time DESC -- CPU time


Выдал 5 запросов всего, из них 4 - это выборка, а 5й - инсерт

INSERT [dbo].[table_name] VALUES(@Param000004,@Param000005,@Param000006,@Param000007,@Param000008)


как узнать кто запускал этот инсерт, и откуда он был запущен?
подозреваю, что какое-то обновление таблицы всё же есть, но не могу ничего найти.
Заранее спасибо за помощь!
4 ноя 15, 18:09    [18369569]     Ответить | Цитировать Сообщить модератору
 Re: как отследить откуда обновляется табличка  [new]
Crimean
Member

Откуда:
Сообщений: 13147
всякие профайлеры и аудиты - не предлагать? про триггера вообще молчу.
просто, боюсь, такого рода информация нигде не накапливается и не хранится
ее надо осознанно собирать, к чему готовиться "чуть заранее"
тогда - узнаете и кто и откуда и когда
4 ноя 15, 18:28    [18369630]     Ответить | Цитировать Сообщить модератору
 Re: как отследить откуда обновляется табличка  [new]
AlesandraFioni
Member

Откуда: Київ
Сообщений: 59
Crimean,
да, профайлеры и аудиты в данном случае неактуальны.

ставить триггер на инсерт? что прописывать в триггере, чтобы получить нужную инфо? т.е. если кто записывает, я ещё догадываюсь как сделать, а вот откуда и полный текст инсерта?
4 ноя 15, 18:32    [18369641]     Ответить | Цитировать Сообщить модератору
 Re: как отследить откуда обновляется табличка  [new]
invm
Member

Откуда: Москва
Сообщений: 9915
AlesandraFioni
как узнать кто запускал этот инсерт, и откуда он был запущен?
Узнать постфактум кто и когда можно, если модель восстановления БД full или bulk-logged - с помощью fn_dblog или fn_dump_dblog.
4 ноя 15, 18:49    [18369714]     Ответить | Цитировать Сообщить модератору
 Re: как отследить откуда обновляется табличка  [new]
AlesandraFioni
Member

Откуда: Київ
Сообщений: 59
invm,

simple :(
4 ноя 15, 18:50    [18369717]     Ответить | Цитировать Сообщить модератору
 Re: как отследить откуда обновляется табличка  [new]
Rankatan
Guest
Попробуйте в логе транзакций глянуть:

SELECT Ins.* FROM
(

	SELECT [Transaction Id], [Begin Time], SUSER_SNAME ([Transaction SID]) AS [User], [Transaction Name]
	FROM fn_dblog (NULL, NULL)
	WHERE [Transaction Name] like N'%INSERT%'
) Ins
CROSS APPLY fn_dblog (NULL, NULL) Lg
CROSS JOIN (VALUES('dbo.T')) TableName(TableName) --МЕНЯТЬ ТУТ
CROSS APPLY (SELECT OBJECT_ID(TableName) TableID) TableID
WHERE Lg.[Transaction ID]=Ins.[Transaction ID]
	AND 
	(
		Lg.[Lock Information] LIKE '%:'+CAST(TableID AS VARCHAR)+':%'
		OR 
		AllocUnitName LIKE TableName+'%'
	)
4 ноя 15, 18:54    [18369734]     Ответить | Цитировать Сообщить модератору
 Re: как отследить откуда обновляется табличка  [new]
AlesandraFioni
Member

Откуда: Київ
Сообщений: 59
Rankatan,

спасибо! но, к сожалению, ничего не показывает:(
4 ноя 15, 18:58    [18369748]     Ответить | Цитировать Сообщить модератору
 Re: как отследить откуда обновляется табличка  [new]
Rankatan
Guest
Попробуйте определить время когда в таблицу вносились изменения

SELECT last_user_update
FROM sys.dm_db_index_usage_stats --сработает только если у таблы есть индекс
WHERE object_id=OBJECT_ID('dbo.table','U')


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

Но это все если модель восстановления не simple
4 ноя 15, 19:16    [18369816]     Ответить | Цитировать Сообщить модератору
 Re: как отследить откуда обновляется табличка  [new]
AlesandraFioni
Member

Откуда: Київ
Сообщений: 59
Rankatan,

индекса нет, но показало изменения в 8-32 сегодняшнего утра.
В логе транзакций ничего нет...
Нашла таки профайлер, никаких процессов в это время не нашла, более того поиском по названии таблицы тоже ничего не нашло...

Но, триггер показал что данные инсертит другой сервер.
Если данные инсертятся удалённым запросом - это можно как-то ещё отследить?
5 ноя 15, 10:24    [18371830]     Ответить | Цитировать Сообщить модератору
 Re: как отследить откуда обновляется табличка  [new]
Glory
Member

Откуда:
Сообщений: 104751
AlesandraFioni
Если данные инсертятся удалённым запросом

Нет никаких "удаленных запросов".
Все запросы выполняются на сервере и отслеживаются профайлером.
5 ноя 15, 10:28    [18371851]     Ответить | Цитировать Сообщить модератору
 Re: как отследить откуда обновляется табличка  [new]
новые данные непонятно
Guest
AlesandraFioni,

так вы бы доступы разрулили бы
если у вас сервер открыт всем ветрам и таблицы доступны любому желающему - дык все ровно так и работает. как задумано.

или в триггере на вставку напишите raiserror - автор инсертов сам с вопросом придет.
5 ноя 15, 10:35    [18371881]     Ответить | Цитировать Сообщить модератору
 Re: как отследить откуда обновляется табличка  [new]
AlesandraFioni
Member

Откуда: Київ
Сообщений: 59
Glory,

но в профайлере ничего нет...
5 ноя 15, 10:37    [18371890]     Ответить | Цитировать Сообщить модератору
 Re: как отследить откуда обновляется табличка  [new]
Glory
Member

Откуда:
Сообщений: 104751
AlesandraFioni
но в профайлере ничего нет...

"Не смогла отмониторить" не равно "ничего нет"
5 ноя 15, 10:39    [18371905]     Ответить | Цитировать Сообщить модератору
 Re: как отследить откуда обновляется табличка  [new]
AlesandraFioni
Member

Откуда: Київ
Сообщений: 59
новые данные непонятно,

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

хотелось бы просто узнать серверными методами, а не разговорами:)
5 ноя 15, 10:41    [18371915]     Ответить | Цитировать Сообщить модератору
 Re: как отследить откуда обновляется табличка  [new]
AlesandraFioni
Member

Откуда: Київ
Сообщений: 59
Glory,

ок, пусть будет так:)
5 ноя 15, 10:46    [18371948]     Ответить | Цитировать Сообщить модератору
 Re: как отследить откуда обновляется табличка  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9184
AlesandraFioni
триггер показал что данные инсертит другой сервер


Ищите виновника на этом сервере.
5 ноя 15, 12:12    [18372469]     Ответить | Цитировать Сообщить модератору
 Re: как отследить откуда обновляется табличка  [new]
o-o
Guest
показываю, что происходит при вставке с удаленного сервера
вида
insert into SISTO_2008.db1.dbo.t(id)...

то же самое можно прочесть вот тут:
Технологии Push и Pull при работе с linked servers в Microsoft SQL Server
при этом действительно кэшируется план для
INSERT [db1].[dbo].[t]([id]) VALUES(@Param000004)
внутри к-ого курсор.
а число выполнений плана равно числу вставляемых строк

К сообщению приложен файл. Размер - 90Kb
5 ноя 15, 12:29    [18372620]     Ответить | Цитировать Сообщить модератору
 Re: как отследить откуда обновляется табличка  [new]
AlesandraFioni
Member

Откуда: Київ
Сообщений: 59
o-o,

спасибо огромное! видимо всё именно так и есть.
5 ноя 15, 13:14    [18372929]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить