Comment trouver toutes les dépendances d'une table dans sql server
J'ai une base de données où j'ai la liste des tables,des procédures,des vues et des déclencheurs. Mais je veux qu'une requête obtienne toutes les dépendances d'une table, y compris les tables enfants qui font référence à la table parent.
11 réponses
Voici la façon de vérifier les dépendances
Méthode 1: utiliser sp_depends
sp_depends 'dbo.First'
GO
Méthode 2: Utiliser information_schema.routines
SELECT *
FROM information_schema.routines ISR
WHERE CHARINDEX('dbo.First', ISR.ROUTINE_DEFINITION) > 0
GO
Méthode 3: Utiliser 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
Outre les méthodes décrites dans d'autres réponses (procédure stockée système sp_depends, fonctions de gestion dynamique SQL Server), vous pouvez également afficher les dépendances entre les objets SQL Server - à partir de SSMS.
Vous pouvez utiliser l'option View Dependencies de SSMS. Dans le volet Explorateur D'objets , cliquez avec le bouton droit sur l'objet et dans le menu contextuel, sélectionnez l'option Afficher les dépendances
Je préfère moi - même une visionneuse de dépendance tierce appelée ApexSQL Rechercher . Il s'agit d'un complément gratuit, qui s'intègre dans SSMS et Visual Studio pour la recherche de texte D'objet et de données SQL, la gestion de propriété étendue, le renommage d'objet sécurisé et la visualisation de relations.
Dans SQL Server 2008, deux nouvelles fonctions de gestion dynamique sont introduites pour garder une trace des dépendances d'objets: sys.dm_sql_referenced_entities et sys. dm_sql_referencing_entities:
1/ rétablir les entités qui font référence à une entité donnée:
SELECT
referencing_schema_name, referencing_entity_name,
referencing_class_desc, is_caller_dependent
FROM sys.dm_sql_referencing_entities ('<TableName>', 'OBJECT')
2/ renvoyer des entités référencées par un objet:
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');
Alternativement, vous pouvez utiliser sp_depends:
EXEC sp_depends '<TableName>'
Une autre option consiste à utiliser un joli outil utile appelé Dépendance SQL Tracker de Porte Rouge.
Interroge la table 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'
Une façon de rechercher uniquement les vues / fonctions / déclencheurs / procédures qui référencent l'objet (ou tout texte donné) par son nom est:
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%'
Recherche de toutes les clés étrangères
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]
Méthode 1: utiliser sp_depends
sp_depends 'dbo.First'
GO
Méthode 2: Utilisation de sys.procédures pour les Procédures Stockées
select Name from sys.procedures where OBJECT_DEFINITION(OBJECT_ID) like '%Any Keyword Name%'
' % any Keyword Name % ' est le mot clé de recherche que vous recherchez
Méthode 3: Utilisation de sys.vues pour Vues
select Name from sys.views where OBJECT_DEFINITION(OBJECT_ID) like '%Any Keyword Name%'
' % any Keyword Name % ' est le mot clé de recherche que vous recherchez
Vous pouvez utiliser un outil gratuit appelé dépendances SQL Server avancées http://advancedsqlserverdependencies.codeplex.com/
Il prend en charge tous les objets de base de données (tables, vues, etc.) et peut trouver des dépendances sur plusieurs bases de données (en cas de synonymes).
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');
, j'ai écrit le code ci-dessous qui répertorie tous les objets où un mot clé donné sera trouvé. Formellement parlant, ce n'est pas une véritable recherche "dépend", mais elle aide plutôt à localiser où un mot-clé est utilisé dans les procédures stockées, les vues, Les déclencheurs et les fonctions. Utile si vous utilisez SQL dynamique.
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 %'
Cette question Est ancienne mais je pensais ajouter ici.. https://www.simple-talk.com/sql/t-sql-programming/dependencies-and-references-in-sql-server/ parle de différentes options avantages et inconvénients et fournit un proc stocké (It_Depends) qui produit un résultat arborescent de dépendances très similaires à SSMS
Dans SQL Server 2008 ou supérieur, j'utilise la requête suivante pour trouver toutes les procédures stockées dépendantes, les fonctions définies par l'utilisateur, les déclencheurs, etc. pour une table donnée:
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]