Учетная база данных клиента SQL Server 2014 объемом 96 ГБ содержит около 1000 таблиц, ни к одной из которых не применены ограничения или fkeys, или они не задокументированы иным образом. У меня есть доступ только для чтения, в основном другие права отсутствуют.

Пользователь прислал мне снимок экрана, показывающий значение, которое где-то хранится в базе данных. Значение равно «51210000», которое также может быть сохранено как указатель на его запись в таблице ACCOUNTS, 323.

Я видел различные решения для поиска по всей базе данных, но они неизменно используют временные таблицы, процедуры или другие решения, которые требуют доступа для записи. Может кто-нибудь предложить способ сделать это только для чтения?

1
Maury Markowitz 27 Фев 2020 в 22:37

2 ответа

Лучший ответ

Это будет немного медленно, но вы можете запустить их по несколько раз, чтобы увидеть, где это может существовать.

SELECT CONCAT('select * from ', TABLE_NAME, ' where ', COLUMN_NAME, ' = ''51210000''')
FROM INFORMATION_SCHEMA.COLUMNS
1
jw11432 27 Фев 2020 в 20:53

Возможно sp_MSforeachtable

Это, конечно, НЕ быстро, и я бы посоветовал провести тестирование на небольшой базе данных.

< Сильный > Пример

Declare @Results table (TableName varchar(500),RowData varchar(max))

Insert Into @Results
 EXEC sp_MSforeachtable 'SELECT TableName=''?'' ,RowData = (Select A.* for XML Raw) FROM ? A Where (Select A.* for XML Raw) like ''%51210000%'''

Select *
 From  @Results

< Сильный > Примечание :

Если 2016+, вы можете получить небольшой импульс, используя альтернативу JSON.

Replace  (Select A.* for XML Raw)
With     (Select A.* for JSON Path)

Просто для удовольствия

Я выполнил тест, ища "Consulting" в базе данных 17 ГБ (214 таблиц). Возвращение заняло 1 минуту 30 секунд

enter image description here

РЕДАКТИРОВАТЬ - Подход динамического SQL

Declare @SQL varchar(max)
Set @SQL=Stuff((Select 'Union All ' +Expr 
                 From  (
                        Select Expr  = 'Select Table_Schema='''+Table_Schema+''',Table_Name='''+Table_Name+''',Column_Name='''+Column_Name+''',Value=cast('+quotename(Column_Name)+' as varchar(max)) From '+quotename(Table_Schema)+'.'+quoteName(Table_Name)+' Where '+quotename(Column_Name)+' like ''%Cappe%''||'
                         From  INFORMATION_SCHEMA.COLUMNS 
                         Where Data_Type in ('varchar','int','float','bigint')  -- << Set Your Desired Filter
                           and Table_Name not like 'vw_%'                       -- << I'd tend to exclude views my prefix vw_
                       ) A
                 For XML Path ('')),1,10,'')
Set @SQL = replace(@SQL,'||',char(13))
Print @SQL
Exec(@SQL)

< Сильный > Возвращает

enter image description here

1
John Cappelletti 28 Фев 2020 в 13:48