Comment savoir quelle procédure stockée ou quel déclencheur utilise une table sur SQL Server 2008 R2?

9

C'est le cas que dans la base de données que je vérifie, il y a une table d'archive qui conserve l'historique de l'utilisateur, et il y a une procédure de déclenchement ou de stockage qui, après un certain temps, supprime les lignes de cette table, afin d'éviter la surdimensionnement de la de même, je n'ai pas conçu la base de données, je prends juste la maintenance d'une application qui utilise cette base de données, donc je ne connais pas le nom de ces procédures stockées ou déclencheurs, ce que je veux faire, c'est localiser cette procédure stockée ou déclencher, vérifier le code et le modifier pour laisser cet "historique utilisateur" plus longtemps sur la table.

Quelqu'un m'a dit de vérifier la table "sysobjects", où je peux réellement voir quelque chose avec le même nom de la table, mais c'est la seule information que j'ai pu récupérer, un conseil?

Je vous remercie.

farp332
la source

Réponses:

6

Rechercher tout le code à l'aide de sys.sql_modules

SELECT OBJECT_NAME(object_id)
FROM sys.sql_modules sm
WHERE definition LIKE '%Mytable%'

Ou utilisez Red Gate SQL Search qui est entièrement gratuit

N'utilisez pas de syscomments ou INFORMATION_SCHEMA.RUBBISH

gbn
la source
Le boursier ne peut-il pas également cliquer avec le bouton droit sur la table cible et cliquer sur "Afficher les dépendances" (ou du texte à cet effet)?
Nick Chammas
@Nick Chammas: non, c'est bien connu comme n'étant pas fiable
gbn
@gbn, je comprends que syscomments est pour la compatibilité descendante et peut être supprimé d'une future version, mais pouvez-vous expliquer pourquoi ne pas utiliser INFORMATION_SCHEMA? thx
datagod
@datagod: même pourquoi syscomments est toujours un mauvais choix: la colonne de définition est nvarchar (4000). Cela signifie que vous pouvez manquer une référence de table si en position de chaîne> 4000 ou enjambe la frontière entre les lignes nvarchar (4000) (dépend de la façon dont vous le gérez, pourrait concaturer je suppose si vous le vouliez vraiment ...
gbn
@gbn a en fait syscommentsplusieurs lignes pour un objet qui dépasse la limite de 4000 caractères, ce qui rend les requêtes l'utilisant tout aussi valides que sys.sql_modules. Je recommande quand même sys.sql_modulescependant car il syscommentsest déprécié.
Kenneth Fisher
4

Essayez la recherche ApexSQL

ApexSQL Search est un complément gratuit de SQL Server Management Studio et Visual Studio qui, entre autres, dispose de la fonction Afficher les dépendances. La fonction Afficher les dépendances a la capacité de visualiser toutes les relations des objets de base de données SQL, y compris celles entre les objets cryptés et système, les objets spécifiques à SQL Server 2012 et les objets stockés dans des bases de données cryptées avec Transparent Data Encryption (TDE)

La fonction Afficher les dépendances vous permet également de configurer et de personnaliser la disposition du diagramme des dépendances visuelles, y compris les relations qui seront présentées, la disposition et la taille du diagramme généré, et la profondeur d'exploration des dépendances

Avertissement: je travaille pour ApexSQL en tant qu'ingénieur de support

Milica Medic
la source
2

Pour référence future à partir de 2008, il existe également un DMV qui peut être utilisé. sys.dm_sql_referencing_entities. Je le préfère généralement à l'utilisation de SQL_Modules car cela évite entre autres les faux positifs. J'en ai discuté ici, mais fondamentalement, si vous avez un morceau de code comme celui-ci:

SELECT OBJECT_SCHEMA_NAME(object_id), OBJECT_NAME(object_id) 
FROM sys.sql_modules WHERE [definition] LIKE '%ABC%'

Vous vous retrouverez avec des résultats pour la table ABC, la table ABCLog la vue vw_ABC, la procédure stockée sp_Update_ABC etc. Aussi, à ma connaissance, le DMV traitera les SP chiffrés ainsi que non chiffrés tandis que la méthode sql_modules ne fonctionne qu'avec des SP non chiffrés .

La version DMV de la même requête est la suivante:

SELECT * FROM sys.dm_sql_referencing_entities('dbo.ABC', 'OBJECT')
Kenneth Fisher
la source
1

Vous pouvez également utiliser la vue de catalogue sys.sql_expression_dependencies . Utilisez cette requête:

SELECT 
referencing_object_name = obj.name, 
referencing_object_type_desc = obj.type_desc, 
referenced_object_name = referenced_entity_name
FROM sys.sql_expression_dependencies sd 
INNER JOIN sys.objects obj 
ON sd.referencing_id = obj.[object_id] 
WHERE referenced_entity_name = 'MyTable'
Milica Medic
la source