У меня есть база данных, где у меня есть список таблиц, процедур, представлений и триггеров. Но я хочу, чтобы запрос получал все зависимости таблицы, включая дочерние таблицы, которые ссылаются на родительскую таблицу.
Как найти все зависимости таблицы в sql-сервере
Ответ 1
Ниже приведены способы, которые мы можем использовать для проверки зависимостей:
Метод 1: Использование sp_depends
sp_depends 'dbo.First'
GO
Способ 2: использование information_schema.routines
SELECT *
FROM information_schema.routines ISR
WHERE CHARINDEX('dbo.First', ISR.ROUTINE_DEFINITION) > 0
GO
Метод 3: Использование DMV sys.dm_sql_referencing_entities
SELECT referencing_schema_name, referencing_entity_name,
referencing_id, referencing_class_desc, is_caller_dependent
FROM sys.dm_sql_referencing_entities ('dbo.First', 'OBJECT');
GO
Ответ 2
Помимо методов, описанных в других ответах (системная хранимая процедура sp_depends, функции динамического управления SQL Server), вы также можете просматривать зависимости между объектами SQL Server - из SSMS.
Вы можете использовать Просмотр зависимостей от SSMS. На панели Объект Explorer щелкните правой кнопкой мыши на объекте и в контекстном меню выберите опцию Вид зависимости
Я сам предпочитаю стороннего зрителя зависимости, называемого ApexSQL Search. Это бесплатная надстройка, которая интегрируется в SSMS и Visual Studio для поиска объектов и текстовых данных SQL, расширенного управления свойствами, безопасного переименования объектов и визуализации отношений.
Ответ 3
В SQL Server 2008 введены две новые функции динамического управления для отслеживания зависимостей объектов: sys.dm_sql_referenced_entities и sys.dm_sql_referencing_entities:
1/Возврат объектов, относящихся к данному объекту:
SELECT
referencing_schema_name, referencing_entity_name,
referencing_class_desc, is_caller_dependent
FROM sys.dm_sql_referencing_entities ('<TableName>', 'OBJECT')
2/Возвращаемые объекты, на которые ссылается объект:
SELECT
referenced_schema_name, referenced_entity_name, referenced_minor_name,
referenced_class_desc, is_caller_dependent, is_ambiguous
FROM sys.dm_sql_referenced_entities ('<StoredProcedureName>', 'OBJECT');
В качестве альтернативы вы можете использовать sp_depends:
EXEC sp_depends '<TableName>'
Другим вариантом является использование довольно полезного инструмента SQL Dependency Tracker из Red Gate.
Ответ 4
Поиск всех внешних ключей
SELECT src.name, srcCol.name, dst.name, dstCol.name
FROM sys.foreign_key_columns fk
INNER JOIN sys.columns srcCol ON fk.parent_column_id = srcCol.[column_id]
AND fk.parent_object_id = srcCol.[object_id]
INNER JOIN sys.tables src ON src.[object_id] = fk.parent_object_id
INNER JOIN sys.tables dst ON dst.[object_id] = fk.[referenced_object_id]
INNER JOIN sys.columns dstCol ON fk.referenced_column_id = dstCol.[column_id]
AND fk.[referenced_object_id] = dstCol.[object_id]
Ответ 5
Запросите таблицу sysdepends:
SELECT distinct schema_name(dependentObject.uid) as schema,
dependentObject.*
FROM sysdepends d
INNER JOIN sysobjects o on d.id = o.id
INNER JOIN sysobjects dependentObject on d.depid = dependentObject.id
WHERE o.name = 'TableName'
Способ поиска только представлений/функций/триггеров/процедур, которые ссылаются на объект (или любой заданный текст) по имени:
SELECT distinct schema_name(so.uid) + '.' + so.name
FROM syscomments sc
INNER JOIN sysobjects so on sc.id = so.id
WHERE sc.text like '%Name%'
Ответ 6
Способ 1: Использование sp_depends
sp_depends 'dbo.First'
GO
Способ 2: Использование sys.procedures для хранимых процедур
select Name from sys.procedures where OBJECT_DEFINITION(OBJECT_ID) like '%Any Keyword Name%'
'% Любое имя ключевого слова%' - ключевое слово поиска, которое вы ищете
Способ 3: Использование sys.views для представлений
select Name from sys.views where OBJECT_DEFINITION(OBJECT_ID) like '%Any Keyword Name%'
'% Любое имя ключевого слова%' - ключевое слово поиска, которое вы ищете
Ответ 7
В SQL Server 2008 или выше я использую следующий запрос для поиска всех зависимых хранимых процедур, пользовательских функций, триггеров и т.д. Для данной таблицы:
SELECT
coalesce(Referenced_server_name+'.','')+ --possible server name if cross-server
coalesce(referenced_database_name+'.','')+ --possible database name if cross-database
coalesce(referenced_schema_name+'.','')+ --likely schema name
coalesce(referenced_entity_name,'') + --very likely entity name
coalesce('.'+col_name(referenced_ID,referenced_minor_id),'')AS [referencing],
coalesce(object_schema_name(Referencing_ID)+'.','')+ --likely schema name
object_name(Referencing_ID)+ --definite entity name
coalesce('.'+col_name(referencing_ID,referencing_minor_id),'') AS [referenced]
FROM sys.sql_expression_dependencies
WHERE referenced_id =object_id('Table_name')
ORDER BY [referenced]
Ответ 8
Вы можете использовать бесплатный инструмент под названием Advanced SQL Server Dependencies http://advancedsqlserverdependencies.codeplex.com/
Он поддерживает все объекты базы данных (таблицы, представления и т.д.) и может находить зависимости между несколькими базами данных (в случае синонимов).
Ответ 9
Существует встроенная процедура проверки зависимостей:
Например,
Execute sp_depends @objname=N'ssc.RegDash_RoutingAct'
Ответ 10
SELECT referencing_schema_name, referencing_entity_name,
case when is_caller_dependent=0 then 'NO' ELSE 'Yes'
END AS is_caller_dependent FROM sys.dm_sql_referencing_entities ('Tablename', 'OBJECT');
Ответ 11
Я написал код ниже, в котором перечислены все объекты, в которых будет найдено заданное ключевое слово. Формально это не правда, "зависит от" поиска, но скорее помогает определить, где ключевое слово используется в хранимых процедурах, представлениях, триггерах и функциях. Полезно, если вы используете динамический SQL.
select name, type_desc,create_date,modify_date
from sys.all_objects o
inner join sys.all_sql_modules m on m.object_id = o.object_id
where definition like '%tableName %'
Ответ 12
Этот вопрос старый, но я подумал, что добавлю здесь. https://www.simple-talk.com/sql/t-sql-programming/dependencies-and-references-in-sql-server/ рассказывает о различных опциях "за" и "против" и предоставляет хранимую процедуру (It_Depends), который создает дерево как результат зависимостей, очень похожих на SSMS
Ответ 13
Следующий SQL перечисляет все объектные зависимости для всех баз данных и серверов:
IF(OBJECT_ID('tempdb..#Obj_Dep_Details') IS NOT NULL)
BEGIN
DROP TABLE #Obj_Dep_Details
END
CREATE TABLE #Obj_Dep_Details
(
[Database] nvarchar(128)
,[Schema] nvarchar(128)
,dependent_object nvarchar(128)
,dependent_object_type nvarchar(60)
,referenced_server_name nvarchar(128)
,referenced_database_name nvarchar(128)
,referenced_schema_name nvarchar(128)
,referenced_entity_name nvarchar(128)
,referenced_id int
,referenced_object_db nvarchar(128)
,referenced_object_type nvarchar(60)
,referencing_id int
,SchemaDep nvarchar(128)
)
EXEC sp_MSForEachDB @command1='USE [?];
INSERT INTO #Obj_Dep_Details
SELECT DISTINCT
DB_NAME() AS [Database]
,SCHEMA_NAME(od.[schema_id]) AS [Schema]
,OBJECT_NAME(d1.referencing_id) AS dependent_object
,od.[type_desc] AS dependent_object_type
,COALESCE(d1.referenced_server_name, @@SERVERNAME) AS referenced_server_name
,COALESCE(d1.referenced_database_name, DB_NAME()) AS referenced_database_name
,COALESCE(d1.referenced_schema_name, SCHEMA_NAME(ro.[schema_id])) AS referenced_schema_name
,d1.referenced_entity_name
,d1.referenced_id
,DB_NAME(ro.parent_object_id) AS referenced_object_db
,ro.[type_desc] AS referenced_object_type
,d1.referencing_id
,SCHEMA_NAME(od.[schema_id]) AS SchemaDep
FROM sys.sql_expression_dependencies d1
LEFT OUTER JOIN sys.all_objects od
ON d1.referencing_id = od.[object_id]
LEFT OUTER JOIN sys.objects ro
ON d1.referenced_id = ro.[object_id]'
SELECT [Database] AS [Dep_Object_DB]
,[Schema] AS [Dep_Object_Schema]
,dependent_object AS [Dep_Object_Name]
,LOWER(REPLACE(dependent_object_type, '_', ' ')) AS [Dep_Object_Type]
,referenced_server_name AS [Ref_Object_Server_Name]
,referenced_database_name AS [Ref_Object_DB]
,referenced_schema_name AS [Ref_Object_Schema]
,referenced_entity_name AS [Ref_Object_Name]
,referenced_id AS [Ref_Object_ID]
,LOWER(REPLACE(referenced_object_type, '_', ' ')) AS [Ref_Object_Type]
,referencing_id AS [Dep_Object_ID]
FROM #Obj_Dep_Details WITH(NOLOCK)
WHERE referenced_entity_name = 'TableName'
ORDER BY [Dep_Object_DB]
,[Dep_Object_Name]
,[Ref_Object_Name]
,[Ref_Object_DB]