Подтвердить что ты не робот

Как найти все зависимости таблицы в sql-сервере

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

4b9b3361

Ответ 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'

image

Ответ 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]

Зависимости TableName