Search
Write a publication
Pull to refresh

Поиск зависимостей между базами данных SQL Server при помощи регулярных выражений

Добрый день!
Хотелось поделится с Вами методом поиска зависимостей между базами данных SQL Server.

Не так давно я столкнулся с такой задачей:
На одном SQL Server есть две базы данных Northwind и AdventureWorks2008R2 (для простоты).

image

Объекты базы AdventureWorks2008R2 используют объекты базы Northwind.
Задача: Нужно перенести используемые объекты из базы Northwind в базу AdventureWorks2008R2.

Как получить список используемых объектов? В реальности количество объектов в каждой БД > 1500
На самом деле очень просто! При помощи SQL Refactor Studio (это расширение для SSMS позволяющее искать произвольный текст в определении объектов), умения составлять регулярные выражения и работать с XML в SQL Server.

Щелкаем по базе AdventureWorks2008R2 ПКМ и выбираем пункт меню «SQL Refactor Studio->Find code»

image

Ставим галку «Use regular expressions» и пишем в поле «Find what» вот такую кракозябру

[\["]?Northwind[]"]?[\["]?[\.][]"]?.+?[\.][\["]?\w{2,}[]"]?


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


Нажимаем Enter или кнопку «Start» на тулбаре. Ждем завершения поиска.

image

Теперь экспортируем результат поиска. На тулбаре есть кнопка Export. Нажав ее мы увидим дерево зависимостей в XML виде.

image

Копируем в буфер полученный XML, открываем в SSMS новое окно и выполняем вот такой запрос (заменяем XML на свой)

DECLARE @xml xml = '
<DatabaseSearchResult  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Server Name="NOTE\SQL2012">
	<Database Name="AdventureWorks2008R2">
		<Object Name="test.NorthwindUsageProc" Type="StoredProcedure" SearchDuration = "34.0038 ms">
			<Match Value="Northwind.dbo.Categories" Offset="62" />
			<Match Value="Northwind.dbo.Customers" Offset="102" />
			<Match Value="Northwind.dbo.Products" Offset="194" />
			<Match Value="Northwind.dbo.Employees" Offset="574" />
		</Object>
		<Object Name="test.SomeNorthwindView" Type="View" SearchDuration = "129.9477 ms">
			<Match Value="Northwind.dbo.[Customers]" Offset="53" />
		</Object>
	</Database>
</Server>
</DatabaseSearchResult>
'

SELECT DISTINCT  
	REPLACE(REPLACE(N.value('@Value', 'nvarchar(200)'), '[', ''), ']', '') AS ObjectName
FROM @xml.nodes('/DatabaseSearchResult[1]/Server/Database/Object/Match') AS T(N)


Вот и все, мы получили список уникальных объектов базы Northwind, которые используются в базе AdventureWorks2008R2.

image

Ну а как выполнить перенос объектов из одной базы в другую, ждите в следующих статьях…
Спасибо за внимание.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.