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

Откуда: VL
Сообщений: 3386
Есть софт, принцип работы которого не понятен.
В нем под сотню таблиц не всегда известного предназначения.
Встала задача, понять - как всё это работает.
Предполагаемый путь:
Создать таблицу с именами остальных таблиц и количеством записей, вводить в систему документы, отслеживать изменение кол-ва строк в таблицах, и на основании этого делать выводы о предназначении данных таблиц.

Соответственно вопросы:
1.
Задача:
Вывести таблицу с двумя полями:
Имя остальных таблиц базы
Кол-во записей.

2. Есть ли другие пути?
27 сен 16, 08:10    [19711633]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменение данных.  [new]
IDVT
Member

Откуда:
Сообщений: 320
982183
... количеством записей....


Вы же понимаете, что только Insert к таблицам отследите, и то не факт что в чистом виде (т.е. софт может выполнять вставку данных без Вашего вмешательства). Вам же нужно еще Update проверять.
27 сен 16, 08:37    [19711667]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменение данных.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
982183,

автор
и на основании этого делать выводы о предназначении данных таблиц.

и что даст вам знание количества строк? можете запускать профайлер и выполнять действия или попробовать реверс на базу, например PowerDesigner
27 сен 16, 09:02    [19711723]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменение данных.  [new]
982183
Member

Откуда: VL
Сообщений: 3386
Да не, всё гораздо проще.
В базе таблицы тира tablе1, tablе2, tablе3 и т.д.
Несколько сотен штук.
Заходить в каждую и смотреть что там - трудоемки и не системно.

В системе есть справочник "сотрудники".
Как узнать - в какой таблице хранятся эти данные.
Выход - внести сотрудника, а потом посмотреть - какие таблицы увеличились.
И дальше уже копать в данных таблицах.
27 сен 16, 10:31    [19712131]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменение данных.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
982183,

нет пределу извращений....

SELECT
    sysobjects.Name
    , sysindexes.Rows
FROM
    sysobjects
    INNER JOIN sysindexes
    ON sysobjects.id = sysindexes.id
WHERE
    type = 'U'
    AND sysindexes.IndId < 2
ORDER BY
    sysobjects.Name
27 сен 16, 10:37    [19712154]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменение данных.  [new]
IDVT
Member

Откуда:
Сообщений: 320
982183
Да не, всё гораздо проще.
В базе таблицы тира tablе1, tablе2, tablе3 и т.д.
Несколько сотен штук.
Заходить в каждую и смотреть что там - трудоемки и не системно.

В системе есть справочник "сотрудники".
Как узнать - в какой таблице хранятся эти данные.
Выход - внести сотрудника, а потом посмотреть - какие таблицы увеличились.
И дальше уже копать в данных таблицах.

Вам ТаПак уже дал наводку, как понять логику и стрктуру, выполняйте конкретные действия в ПО, запросы ловите в профайлере, основываясь на их листинг все разложите по полкам.
27 сен 16, 10:37    [19712157]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменение данных.  [new]
982183
Member

Откуда: VL
Сообщений: 3386
TaPaK - за извращение спасибо.
Будем пробовать.
27 сен 16, 10:40    [19712167]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменение данных.  [new]
Adx
Guest
Только профайлер.
27 сен 16, 18:56    [19715194]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменение данных.  [new]
komrad
Member

Откуда:
Сообщений: 5736
982183
В системе есть справочник "сотрудники".
Как узнать - в какой таблице хранятся эти данные.


в свое время написал такое

+ для моих нужд подошло
SELECT c.TABLE_NAME
	,c.TABLE_SCHEMA
	,c.COLUMN_NAME
INTO #srch
FROM INFORMATION_SCHEMA.[COLUMNS] c
WHERE DATA_TYPE IN (
		'varchar'
		,'char'
		,'nvarchar'
		,'nchar'
		)
--ORDER BY TABLE_NAME
GO

DECLARE @cmd VARCHAR(2048)
DECLARE @tbl VARCHAR(100)
DECLARE @tbl_old VARCHAR(100)
DECLARE @clm VARCHAR(100)
DECLARE @own VARCHAR(50)
DECLARE @what VARCHAR(100)
DECLARE @bar INT
DECLARE @i INT

SET @cmd = ''
SET @what = 'ИСКОМОЕ СЛОВО'
SET @i = 1
SET @tbl_old = ''

SELECT @bar = COUNT(1)
FROM #srch

WHILE EXISTS (
		SELECT TOP 1 1
		FROM #srch
		)
BEGIN
	SELECT TOP 1 @own = TABLE_SCHEMA
		,@tbl = TABLE_NAME
		,@clm = COLUMN_NAME
	FROM #srch

	IF @tbl_old != @tbl
	BEGIN
		SELECT @cmd = 'Analyzing table : ' + QUOTENAME(@own) + '.' + QUOTENAME(@tbl)

		PRINT @cmd
	END

	SELECT @cmd = 'set nocount on; if exists (select 1 from ' + QUOTENAME(@own) + '.' + QUOTENAME(@tbl) 
				+ ' where lower(' + QUOTENAME(@clm) 
				+ ') like ''%' + @what + '%'') ' + 'select ''' + QUOTENAME(@own) + '.' + QUOTENAME(@tbl) + '.' + QUOTENAME(@clm) 
				+ ''' as [Object], ' + '''select ' + + QUOTENAME(@clm) + ', * from ' + QUOTENAME(@own) + '.' + QUOTENAME(@tbl) 
				+ ' where lower(' + QUOTENAME(@clm) + ') like ''''%' + @what + '%'''''' as [cmd]'

	--PRINT @cmd
	EXEC (@cmd)

	SELECT @i = @i + 1

	IF ((@i * 100 / @bar) % 5) = 0
	BEGIN
		SELECT @cmd = '************************** Search progress: ' + CONVERT(VARCHAR(10), @i * 100 / @bar) + '% (' + CONVERT(VARCHAR(10), @i - 1) + ' / ' + CONVERT(VARCHAR(10), @bar) + ')'

		PRINT @cmd
	END

	DELETE #srch
	WHERE TABLE_SCHEMA = @own
		AND TABLE_NAME = @tbl
		AND COLUMN_NAME = @clm

	SELECT @tbl_old = @tbl
END

drop table #srch
27 сен 16, 19:14    [19715251]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменение данных.  [new]
982183
Member

Откуда: VL
Сообщений: 3386
TaPaK - извращение попробовал.

Name Rows
MSreplication_options 3
spt_fallback_db 0
spt_fallback_dev 0
spt_fallback_usg 0
spt_monitor 1

Пока ничего не понял.
разбираюсь.
28 сен 16, 03:56    [19716283]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменение данных.  [new]
982183
Member

Откуда: VL
Сообщений: 3386
А таблица sysobjects где гаходится?
Не нашел ....
28 сен 16, 04:03    [19716286]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменение данных.  [new]
mag2000
Member

Откуда:
Сообщений: 187
982183,
автор
А таблица sysobjects где гаходится?
Не нашел ....

select *
from [Имя_базы].sys.sysobjects

https://technet.microsoft.com/ru-ru/library/ms177596(v=sql.105).aspx
28 сен 16, 05:55    [19716300]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменение данных.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
982183,

А хоть на правильной базе выполняли :)
28 сен 16, 07:27    [19716374]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменение данных.  [new]
982183
Member

Откуда: VL
Сообщений: 3386
Ну конечно же нет.
Указал базу - дело пошло.
Увидел и имена нужных файлов, и количество записей
28 сен 16, 08:37    [19716477]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменение данных.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
982183
Ну конечно же нет.
Указал базу - дело пошло.
Увидел и имена нужных файлов, и количество записей

самое интересное что файлы запрос не показывает
28 сен 16, 08:59    [19716531]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменение данных.  [new]
982183
Member

Откуда: VL
Сообщений: 3386
Сорри - имена таблиц.

Тяжелое DBF прошлое влияет.
28 сен 16, 09:13    [19716562]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменение данных.  [new]
982183
Member

Откуда: VL
Сообщений: 3386
А хранится ли где-то там еще и дата последнего изменения или доступа.
Куча мусорных файлов, от которых есть желание избавиться..
29 сен 16, 02:36    [19721499]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменение данных.  [new]
mag2000
Member

Откуда:
Сообщений: 187
982183,
автор
А хранится ли где-то там еще и дата последнего изменения или доступа.
Куча мусорных файлов, от которых есть желание избавиться..

Находил однажды такой запрос (использовал давно):
+

SELECT 
  DatabaseName = DB_NAME(db.database_id), 
  last_user_read = NULLIF(MAX(ISNULL(LU.last_user_read, '1900-01-01')), '1900-01-01'), 
  last_user_update = NULLIF(MAX(ISNULL(LU.last_user_update, '1900-01-01')), '1900-01-01'),
  db_create_date = DB.create_date
FROM sys.databases DB
  LEFT JOIN
  (
    SELECT database_id, MAX(ISNULL(last_user_seek, '1900-01-01')) AS last_user_read, '1900-01-01' AS last_user_update 
	FROM sys.dm_db_index_usage_stats GROUP BY database_id
    UNION ALL
    SELECT database_id, MAX(ISNULL(last_user_scan, '1900-01-01')), '1900-01-01' 
	FROM sys.dm_db_index_usage_stats GROUP BY database_id
    UNION ALL
    SELECT database_id, MAX(ISNULL(last_user_lookup, '1900-01-01')), '1900-01-01' 
	FROM sys.dm_db_index_usage_stats GROUP BY database_id
    UNION ALL
    SELECT database_id, '1900-01-01', MAX(ISNULL(last_user_update, '1900-01-01')) 
	FROM sys.dm_db_index_usage_stats GROUP BY database_id
  ) LU ON LU.database_id = DB.database_id
GROUP BY DB_NAME(db.database_id), db.create_date
ORDER BY last_user_read DESC, last_user_update DESC

29 сен 16, 05:40    [19721545]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменение данных.  [new]
mag2000
Member

Откуда:
Сообщений: 187
982183,
автор
Куча мусорных файлов, от которых есть желание избавиться

Если вы про "потерянные" файлы баз данных (т.е. на диске находятся какие-то файлы баз данных, которых нет у SQL-экземпляра), то попробуйте почитать тут:
http://www.sqlservercentral.com/scripts/Administration/134742/
29 сен 16, 05:47    [19721548]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменение данных.  [new]
982183
Member

Откуда: VL
Сообщений: 3386
И снова сорри.
Конечно же куча мусорных таблиц в базе.
Людям было лень почистить, и они старые версии таблиц, буферные таблицы и прочее, не стирали, а оставляли в базе.
29 сен 16, 06:54    [19721583]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить